2010-12-14 103 views
2

J'ai une variable globale qui a été déclarée dans une formule dans la section En-tête du rapport de mon document. J'essaie alors de faire référence à cette variable pour l'utiliser dans une boucle, et je reçois l'erreur:Crystal Reports Erreur dans la formule

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

Quel est le problème ici et comment puis-je corriger? Code suit:

tête Formule:

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; 

"" 

Détail Formule:

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; 

Répondre

1

Dans la syntaxe des rapports de cristal, les variables doivent être déclarées chaque fois que vous les utilisez. Je n'étais pas au courant que je dois déclarer les variables à la fois dans la formule d'en-tête et dans la formule de détail. J'ai fait d'autres petites erreurs de syntaxe, mais c'était le problème principal.

Je n'ai même pas considéré cela comme une possibilité car dans la plupart des langues, déclarer une variable plus d'une fois empêchera le programme de compiler, et encore moins de l'exécuter.

Section d'en-tête

BeforeReadingRecords; 

Global StringVar Array items; 

Global StringVar Array jobs; 

Global StringVar Array POs; 

Global NumberVar Array Qty; 

Global NumberVar numRecordsPrinted; 

"" 

Section Détail

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

Sûrement ce bit:

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

     default: poTOuse = ""; 

devrait être

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

     default: poTOuse := ""; 

Bien qu'il soit pas clair ce LinePOnum, Line_PO_3 et Line_PO_2 sont.

+0

Oui, ressemble à votre correcte. Ce sont d'autres formules de Crystal Report, mais je ne les ai pas référencées correctement. Je vais corriger cette partie et éditer la question. Des idées sur le code d'erreur? – MAW74656

1

Si vous commentez la section de code suivante comme ceci, obtenez-vous toujours une erreur?

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 
     ) 

Si oui, vous obtenez toujours l'erreur lorsque vous commentez occurances := occurances + 1?

Puisque les tableaux sont StringVars, vous pourrait besoin d'envelopper vos champs de base de données avec cstr comme ceci:

(
     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 
    ) 

Si vous voulez supprimer les décimales de fin pour la Quantity_Shipped, vous pouvez utiliser cstr({PS_DETAIL_FOR_PRINT.Quantity_Shipped}, "0") à la place.

+0

Aucun de ces problèmes n'a été le principal, mais puisque vous avez pris le temps de regarder et d'enquêter, vous méritez la prime. Merci de votre aide. – MAW74656