2010-12-14 3 views
2

У меня есть глобальная переменная, которая была объявлена ​​в формуле в разделе Заголовок отчета моего документа. Затем я стараюсь ссылаться на эту переменную, чтобы использовать ее в цикле, и я получаю сообщение об ошибке:Ошибка Crystal Reports в формуле

A number, currency amount, boolean, data, time, date-time, or string is expected here.

Что здесь не так, и как я могу исправить? Код следующим образом:

Заголовок формула:

Global StringVar Array items; 
redim items [1]; 

Global StringVar Array jobs; 
redim jobs [1]; 

Global StringVar Array POs; 
redim POs [1]; 

Global StringVar Array Qty; 
redim Qty [1]; 

Global NumberVar numRecordsPrinted; 
numRecordsPrinted := 0; 

"" 

Detail формула:

Local NumberVar occurances; 
    Local StringVar poTOuse; 
    Local NumberVar i; 

    if {%Line_PO_Test} <> '' 
    and {PackingSlipHeader.CompanyCode} <> '10063' 
    and {PackingSlipHeader.CompanyCode} <> '10017' 
    then 
     //Count the number of occurances 
     For i := 0 To numRecordsPrinted Do  //Error on numRecordsPrinted 
     (
      if items[i] = {PS_DETAIL_FOR_PRINT.DTSItemNumber} 
       AND jobs[i] = {PS_DETAIL_FOR_PRINT.JobNumber} 
       And Qty[i] = {PS_DETAIL_FOR_PRINT.Quantity_Shipped} 
       THEN 
        occurances := occurances + 1 
     ) 

     //Use the # of occurances to get the right PO number 
Select occurances 
     case 0: poTOuse := {@LinePOnum} 
     case 1: poTOuse := {@Line_PO_3} 
     case 2: poTOuse := {@Line_PO_2} 

     default: poTOuse := ""; 


     //Save data into the array and increment for next time 
     numRecordsPrinted := numRecordsPrinted + 1 
     items[numRecordsPrinted] := {PS_DETAIL_FOR_PRINT.DTSItemNumber} 
     jobs[numRecordsPrinted] := {PS_DETAIL_FOR_PRINT.JobNumber} 
     Qty[numRecordsPrinted] := {PS_DETAIL_FOR_PRINT.Quantity_Shipped} 

    //Print to the report 
    'PO#: ' + poTOuse; 

ответ

1

В синтаксисе кривых отчетов переменные должны быть объявлены каждый раз, когда вы их используете. Я не знал, что мне нужно объявить переменные как в формуле заголовка, так и в формуле детали. Я сделал некоторые другие небольшие синтаксические ошибки, но это была основная проблема.

Я даже не рассматривал это как возможность, потому что в большинстве языков объявление переменной более одного раза заставит программу даже не компилировать, не говоря уже о запуске.

Раздел Заголовок

BeforeReadingRecords; 

Global StringVar Array items; 

Global StringVar Array jobs; 

Global StringVar Array POs; 

Global NumberVar Array Qty; 

Global NumberVar numRecordsPrinted; 

"" 

Detail Раздел

WhileReadingRecords; 
Global StringVar Array items; 

Global StringVar Array jobs; 

Global StringVar Array POs; 

Global NumberVar Array Qty; 

Global NumberVar numRecordsPrinted; 
Global NumberVar occurances; 
occurances := 0; 

Global StringVar poTOuse; 
Global NumberVar i; 

ReDim Preserve items[CDbl(Ubound(items) + 1)]; 
ReDim Preserve jobs[CDbl(Ubound(jobs) + 1)]; 
ReDim Preserve POs[CDbl(Ubound(POs) + 1)]; 
ReDim Preserve Qty[CDbl(Ubound(Qty) + 1)]; 

if {%Line_PO_Test} <> "" 
and {PackingSlipHeader.CompanyCode} <> "10063" 
and {PackingSlipHeader.CompanyCode} <> "10017" 
then 
    //Count the number of occurances 
    For i := 1 To (numRecordsPrinted + 1) Do 
    (
     if items[i] = {PS_DETAIL_FOR_PRINT.DTSItemNumber} 
      AND jobs[i] = {PS_DETAIL_FOR_PRINT.JobNumber} 
      And Qty[i] = {PS_DETAIL_FOR_PRINT.Quantity_Shipped} 
      THEN 
       occurances := occurances + 1 
    ); 

    //Use the # of occurances to get the right PO number 
    Select occurances 
     case 0: poTOuse := {%Line_PO_Test} 
     case 1: poTOuse := {%Line_PO_3} 
     case 2: poTOuse := {%Line_PO_2} 

     default: poTOuse := ""; 

    //Save data into the array and increment for next time 
    numRecordsPrinted := numRecordsPrinted + 1; 
    items[numRecordsPrinted] := {PS_DETAIL_FOR_PRINT.DTSItemNumber}; 
    jobs[numRecordsPrinted] := {PS_DETAIL_FOR_PRINT.JobNumber}; 
    Qty[numRecordsPrinted] := {PS_DETAIL_FOR_PRINT.Quantity_Shipped}; 

//Print to the report 
if poTOuse <> "" THEN 
'PO#: ' + poTOuse 
ELSE 
""; 
1

Конечно, это немного:

Select occurances 
     case 0: poTOuse = LinePOnum 
     case 1: poTOuse = Line_PO_3 
     case 2: poTOuse = Line_PO_2 

     default: poTOuse = ""; 

должен быть

Select occurances 
     case 0: poTOuse := LinePOnum 
     case 1: poTOuse := Line_PO_3 
     case 2: poTOuse := Line_PO_2 

     default: poTOuse := ""; 

Хотя неясно, что такое LinePOnum, Line_PO_3 и Line_PO_2.

+0

Да, выглядит ваш правильный. Это другие формулы Crystal Report, но я не ссылался на них должным образом. Я исправлю эту часть и отредактирую вопрос. Любые идеи по коду ошибки? – MAW74656

1

Если вы прокомментируете следующий раздел кода, например, вы все равно получите сообщение об ошибке?

For i := 0 To numRecordsPrinted Do  //Error on numRecordsPrinted 
     (
//   if items[i] = {PS_DETAIL_FOR_PRINT.DTSItemNumber} 
//    AND jobs[i] = {PS_DETAIL_FOR_PRINT.JobNumber} 
//    And Qty[i] = {PS_DETAIL_FOR_PRINT.Quantity_Shipped} 
//    THEN 
        occurances := occurances + 1 
     ) 

Если да, то вы все равно получите ошибку, когда вы закомментировать occurances := occurances + 1?

Поскольку массивы StringVars, вы может нужно обернуть полей базы данных с cstr, как это:

(
     if items[i] = cstr({PS_DETAIL_FOR_PRINT.DTSItemNumber}) 
      AND jobs[i] = cstr({PS_DETAIL_FOR_PRINT.JobNumber}) 
      And Qty[i] = cstr({PS_DETAIL_FOR_PRINT.Quantity_Shipped}) 
      THEN 
       occurances := occurances + 1 
    ) 

Если вы хотите удалить ведомые знаков после запятой для Quantity_Shipped, вы можете использовать cstr({PS_DETAIL_FOR_PRINT.Quantity_Shipped}, "0") вместо этого.

+0

Ни одна из них не была основной проблемой, но поскольку вы нашли время, чтобы посмотреть и исследовать, вы заслуживаете награду. Спасибо за вашу помощь. – MAW74656

Смежные вопросы