Почему возвращаемое значение всегда является пустой строкой?

Моя функция PowerBuilder возвращает жестко закодированные строковые значения при определенных условиях.

Я проверил в отладчике, и одно из условий обязательно отправляет обратно жестко закодированную строку, но на стороне, где был сделан вызов функции, я всегда получаю пустую строку "".

Этот трюк с PowerBuilder является новым для меня, и я не мог понять, проблема ли в этой функции или в скрипте, который вызывает функцию.

Пожалуйста, посмотрите код функции и помогите мне выбраться из этих канав PowerBuilder. :(

С уважением,

/// Function Name: _wichTransObject
/// Parameters: Gets Datawindow control
/// Return: String name of the transaction object to use.
/// Purpose: when image is there in nested reports or the directly blob column is used in datawindow object,
/// only native connection can display images while ODBC fails. This function was written to select proper 
/// transaction object so images are displayed in reports.

String dwSyntax, dwo, OriginalDwo
Long RptAt, RptDwoAt, BlobAt

dw_1.SetRedraw(FALSE)
OriginalDwo = dw_1.DataObject

dwSyntax = dw_1.Describe("datawindow.syntax");

/// Nested Reports may have images in them. That can be checked 
/// find the report and if exist then pick its dwo and repeat same steps again for more reports
RptAt = Pos(dwSyntax, "report(", 1)
DO WHILE RptAt > 0
    RptDwoAt = 0
    RptDwoAt = Pos(dwSyntax, "dataobject=", RptAt) /// Get the dataobject of current report
    IF RptDwoAt > 0 THEN
        /// set the dataobject to dw_1 and explore it further
        dwo = Mid(dwSyntax, RptDwoAt + 12, Pos(dwSyntax, "~"", RptDwoAt + 12)  - ( RptDwoAt + 12 ))
        dw_1.DataObject = dwo

        /// explore the nested dataobject and look for blob column
        dwSyntax = dw_1.Describe("datawindow.syntax");
        BlobAt = Pos(dwSyntax, "keyclause", 1) 
        IF BlobAt > 0 THEN /// if blob exist then return NATCA
            dw_1.DataObject = OriginalDwo
            dw_1.SetRedraw(TRUE)
            Return "NATCA"
        END IF
    END IF
LOOP

/// find the report and if exist then pick its dwo and repeat same steps again for more reports
BlobAt = Pos(dwSyntax, "keyclause", 1)
IF BlobAt > 0 THEN
    dw_1.DataObject = OriginalDwo
    dw_1.SetRedraw(TRUE)
    Return "NATCA"
ELSE
    dw_1.DataObject = OriginalDwo
    dw_1.SetRedraw(TRUE)
    Return "SQLCA"  
END IF

/// Ниже приведен код, который вызывает функцию выше

String WTO

WTO = _WhichTransObject(dw_pb_report)
IF WTO = "NATCA" THEN
    /// Make a native connection
    dw_1.SetTransObject(NATCA)
ELSE
    /// Go away with ODBC
    dw_1.SetTransObject(SQLCA)
END IF

person Shoki    schedule 13.09.2018    source источник
comment
Переименование функции решило эту проблему. Это никогда не было проблемой с событиями, которые я всегда начинаю с подчеркивания. Но я предположил изменить имя функции, не зная точной причины. WTO = oayoay_whattransobject(dw_pb_report) получает правильное возвращаемое значение из функции.   -  person Shoki    schedule 13.09.2018
comment
Для дальнейшего использования всегда полезно указать версию PB, которую вы используете.   -  person Matt Balent    schedule 13.09.2018
comment
PowerBuilder v11.5 на 64-битной Windows 7. Функция является глобальной функцией. Я не уверен, что имя оконной функции при запуске с символом подчеркивания приведет к пустой строке возвращаемого значения жестко закодированной строки. Пожалуйста, узнайте это сами. @Matt Balent Спасибо, что напомнили мне о версиях.   -  person Shoki    schedule 14.09.2018
comment
Извините, я забыл упомянуть, что вышеуказанная глобальная функция является примером плохого кодирования. Вы можете видеть, что RptAt не установлен внутри цикла (да, сумасшедший). На самом деле цикл не будет работать, если вы углубитесь во вложенные отчеты для поиска столбцов больших двоичных объектов. для этой цели лучше использовать рекурсивный вызов функции. Я имею в виду, если в объекте DW есть вложенный отчет, и этот вложенный отчет также имеет вложенные отчеты и так далее. В этом случае нужен рекурсивный вызов. Мне нужно обновить эту функцию, но пока я просто надеюсь, что это сделает кто-то другой, например, @Matt Balent с пакетом благодарностей заранее. ваше здоровье!   -  person Shoki    schedule 14.09.2018
comment
Как правило, рекомендуется отвечать на вопрос самостоятельно (если вы его решили) и помечать как правильный ответ таким образом, если другие посмотрят, они увидят, что на него ответили. Этот вопрос, вероятно, больше не будет упоминаться, но разработчики рассмотрят его, чтобы помочь вам, а затем узнают, что на него был дан ответ. Добро пожаловать в СО.   -  person Rich Bianco    schedule 08.10.2018


Ответы (1)


Переименование функции решило эту проблему.

Это никогда не было проблемой с событиями, которые я всегда начинаю с подчеркивания. Но я предположил изменить имя функции, не зная точной причины.

WTO = oayoay_whichtransobject(dw_pb_report) получает правильное возвращаемое значение от функции. Это была глобальная функция.

person Shoki    schedule 09.10.2018