Member 12609377 Ответов: 5

Оператор If else ничего не возвращает (VB6)


Может ли кто-нибудь сказать мне, что у нас не так с этим кодом? Была выдана ошибка "путь не найден".
uSQL = "SELECT soa_month FROM DMF_SocsoArrears WHERE SOA_PAYMONTH = " & Month(dtpSocsoDate.Value) & " AND " & _
       "SOA_PAYYEAR = " & Year(dtpSocsoDate.Value) & " AND (SOA_SOAMTEE+SOA_SOAMTER) > 0 "

   RS1.Open vSQL, Conn, adOpenStatic, adLockReadOnly
   RS2.Open uSQL, Conn, adOpenStatic, adLockReadOnly
   'If RS2.RecordCount > 0 Then
   'While Not RS2.EOF
    If uSQL = "1" Then
       tFileName = "January.TXT"
    ElseIf uSQL = "2" Then
       tFileName = "February.TXT"
    ElseIf uSQL = "3" Then
       tFileName = "March.TXT"
    ElseIf uSQL = "4" Then
       tFileName = "April.TXT"
    ElseIf uSQL = "5" Then
       tFileName = "May.TXT"
    ElseIf uSQL = "6" Then
       tFileName = "June.TXT"
    ElseIf uSQL = "7" Then
       tFileName = "July.TXT"
    ElseIf uSQL = "8" Then
       tFileName = "August.TXT"
    ElseIf uSQL = "9" Then
       tFileName = "September.TXT"
    ElseIf uSQL = "10" Then
       tFileName = "October.TXT"
    ElseIf uSQL = "11" Then
       tFileName = "November.TXT"
    ElseIf uSQL = "12" Then
       tFileName = "December.TXT"
    End If
   'Wend
   'End If
   'tFileName = "January.TXT"
   intFileHandle2 = FreeFile

   Dim sPath As String
   sPath = txtSocsoLoc.Text & tFileName
   MsgBox "" & tFileName, vbInformation, Me.Caption
   'If Dir(spath) <> "" Then spath = txtSocsoLoc.Text & "NOMANTH.TXT"
   Open sPath For Output As #intFileHandle2


Что я уже пробовал:

Поэтому я попытался увидеть результат tFileName через поле msg, которое ничего не возвращает.

5 Ответов

Рейтинг:
44

Jochen Arndt

Вы проверяете uSQL это строка SQL-запроса. Вместо этого вы должны проверить значения полей набора записей (непроверенные):

If RS2.RecordCount > 0 Then
    While Not RS2.EOF
        If RS2!soa_month = "1"
            ' January
        EndIf
        RS2.MoveNext
    Wend
End If
Вместо короткой синтаксической формы (bang) RS2!soa_month вы также можете использовать RS2.Fields("soa_month").Value, RS2("soa_month").Value, или RS2.Fields(0).Value (здесь ноль-это нулевой индекс возвращаемых полей набора записей, который здесь должен быть равен нулю, поскольку вы запрашиваете только одно поле).


Member 12609377

БОЛЬШОЕ СПАСИБО!!!!!!!!!!!!!!!!!!!!!! ТЫ СПАС МНЕ ЖИЗНЬ! Я действительно Новичок в vb6 и sql и все еще учусь, извините, если я спросил что-то глупое, я думаю, что сделал это.

Рейтинг:
35

Patrice T

Некоторые странные вещи в вашем коде:
- uSQL содержит текст вашего SQL-запроса, а не ответ.
- можно ожидать, что результат будет в RS2
- можно ожидать, что число месяца будет числовым, а не строковым
Чтобы узнать, что есть что, используйте отладчик и проверяйте переменные
-----
Ваш код ведет себя не так, как вы ожидаете, и вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что вы должны делать, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]

Отладка в Excel VBA - простые макросы Excel[^]
MS Excel 2013: введение в отладку VBA[^]
Как отладить Excel VBA - YouTube[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
21

GKP1992

Как указал CPallini, вы сравниваете uSql с другими строковыми значениями, которые даже не близки к тому, что такое uSql.
Например, если tpSocsoDate равен 01/01/2018, то uSql будет

"SELECT soa_month FROM DMF_SocsoArrears WHERE SOA_PAYMONTH = 1 AND SOA_PAYYEAR = 2018 AND (SOA_SOAMTEE+SOA_SOAMTER) > 0 "


Это не равные условия в вашем случае еще, если лестница.

То, что вы хотите сделать, это выполнить командную строку в uSql в базе данных и сохранить возвращенное значение внутри локальной переменной. Затем сравниваем эту переменную в ЕСЛИ ТО если трап не SQL-команды.

С другой стороны, никогда не объединяйте строки для выполнения команды SQL. Это делает ваш код уязвимым для атак sql-инъекций. Вместо этого используйте параметризованные запросы.


Рейтинг:
2

Member 12609377

So here is what i changed and the problem was solved. Thanks everyone!


<pre> vSQL = vSQL & " GROUP BY SOA_COMPNO, SOA_FAC, EEP_NAME, EEP_IC, EEP_SOCSONO, dtjoin, dtresign ORDER BY SOA_COMPNO, SOA_FAC, EEP_NAME "
    
    uSQL = "SELECT soa_month FROM DMF_SocsoArrears WHERE SOA_PAYMONTH = " & Month(dtpSocsoDate.Value) & " AND " & _
        "SOA_PAYYEAR = " & Year(dtpSocsoDate.Value) & " AND (SOA_SOAMTEE+SOA_SOAMTER) > 0 "
    
    RS1.Open vSQL, Conn, adOpenStatic, adLockReadOnly
    RS2.Open uSQL, Conn, adOpenStatic, adLockReadOnly
    If RS2.RecordCount > 0 Then
     While Not RS2.EOF
        If RS2!soa_month = "1" Then
           tFileName = "January.TXT"
        ElseIf RS2!soa_month = "2" Then
           tFileName = "February.TXT"
        ElseIf RS2!soa_month = "3" Then
           tFileName = "March.TXT"
        ElseIf RS2!soa_month = "4" Then
           tFileName = "April.TXT"
        ElseIf RS2!soa_month = "5" Then
           tFileName = "May.TXT"
        ElseIf RS2!soa_month = "6" Then
           tFileName = "June.TXT"
        ElseIf RS2!soa_month = "7" Then
           tFileName = "July.TXT"
        ElseIf RS2!soa_month = "8" Then
           tFileName = "August.TXT"
        ElseIf RS2!soa_month = "9" Then
           tFileName = "September.TXT"
        ElseIf RS2!soa_month = "10" Then
           tFileName = "October.TXT"
        ElseIf RS2!soa_month = "11" Then
           tFileName = "November.TXT"
        ElseIf RS2!soa_month = "12" Then
           tFileName = "December.TXT"
        End If
     RS2.MoveNext
     Wend
    End If
    'tFileName = "January.TXT"
    intFileHandle2 = FreeFile
    
    Dim sPath As String
    sPath = txtSocsoLoc.Text & tFileName
    MsgBox "" & tFileName, vbInformation, Me.Caption
    'If Dir(spath) <> "" Then spath = txtSocsoLoc.Text & "NOMANTH.TXT"
    Open sPath For Output As #intFileHandle2


Рейтинг:
12

CPallini

Ну что ж, ответ прост: uSQL строка не соответствует ни одному из ожидаемых условий. Это не удивительно, так как это всего лишь SQL QUERY текст.


Member 12609377

Спасибо, что ответили. Но проблема в том, что даже когда я не ставил никаких условий ( uSQL = "SELECT soa_month FROM DMF_SocsoArrears), результат все равно остается тем же. Для условий (1-12) в базе данных есть строка, где soa_month = 1 и ее столбец int. пожалуйста, помогите, спасибо.

GKP1992

По-моему, слишком тонкий намек. :Д

Maciej Los

5ed!