Options

Temp table en FINDSET/FINDFIRST

lyotlyot Member Posts: 202
edited 2008-03-20 in NAV Dutch speaking only
Hallo,

Ik heb een temp table die ik opvul a.d.h.v. een REPEAT UNTIL.
Tot zover geen vuiltje aan de lucht.
Als ik nu die temp table teurg wil overlopen dan heb ik iets 'raar' voor...

Ik wil die table als volgt overlopen:
IF tempTable.FINDSET(FALSE,FALSE) THEN
  REPEAT
    //bewerkingen
  UNTIL tempTable.NEXT = 0;
of
IF tempTable.FINDFIRST THEN
  REPEAT
    //bewerkingen
  UNTIL tempTable.NEXT = 0;


Bovenstaande code werkt niet, dit omdat hij los over die FINDSET/FINDFIRST gaat en
dus nooit in zijn REPEAT UNTIL komt.

Als ik nu echter het volgende doe:
REPEAT
  //bewerkingen
UNTIL tempTable.NEXT = 0;

Dan werkt dit wel naar behoren... op het eerste zicht althans.
Maar is dit wel erg correct? Omdat ik mij nu niet echt expliciet positioneer
op het eerste record in mijn temp table. ](*,)

Answers

  • Options
    ajhvdbajhvdb Member Posts: 672
    Voor het vullen zie ik geen code maar doe je hierna wel eerst een RESET;
  • Options
    lyotlyot Member Posts: 202
    ajhvdb wrote:
    Voor het vullen zie ik geen code maar doe je hierna wel eerst een RESET;

    Jazeker, ik heb zelfs al eens geprobeerd met er een filter op te plaatsen
    maar andermaal helaas...
  • Options
    ajhvdbajhvdb Member Posts: 672
    wat gebeurt er bij:
    IF tempTable.FIND('-') THEN 
    
    IF tempTable.FINDSET THEN 
    

    of laat alle code even zien
  • Options
    lyotlyot Member Posts: 202
    Beiden zonder resultaat jammergenoeg...

    De temptable wordt opgevuld in form, als er daar op een button wordt gedrukt. Deze wordt vandaar dan doorgegeven aan een code unit waar alle records van deze temptable worden overlopen.

    Wel merk ik in debug dat de temptable reeds een waarde bevat vooraleer men aan de FINDSET komt... Niet zo heel uitzonderlijk want meestal gaat men een findset gebruiken in combinatie met filters, om na filteren zich te positioneren op het eerste record na filtering. Filters zijn echter niet van toepassing op deze temptable.
    Ik heb reeds geprobeerd om domweg er een filter op te plaatsen, maar dit lukt ook niet.
  • Options
    Luc_VanDyckLuc_VanDyck Member, Moderator, Administrator Posts: 3,633
    Ik ben bang dat we hier niet veel zinnigs over kunnen vertellen, indien we niet de volledige C/AL code te zien krijgen.
    No support using PM or e-mail - Please use this forum. BC TechDays 2024: 13 & 14 June 2024, Antwerp (Belgium)
  • Options
    lyotlyot Member Posts: 202
    edited 2008-03-07
    FORM
    lrecTransportLine.RESET;
    lrecTransportLine.SETRANGE("Transport No.","Transport No");
    
    IF lrecTransportLine.FINDSET(FALSE,FALSE) THEN
      REPEAT
         //...
            IF (lrecSalesLine."Quantity (Base)" > ldecBaseTotal) AND (ldecBaseTotal <> 0) THEN
              BEGIN
                lrecTmpTransportLine.COPY(lrecTransportLine);
                lrecTmpTransportLine.VALIDATE(Quantity,lrecSalesLine."Quantity (Base)"-ldecBaseTotal);
                lrecTmpTransportLine.VALIDATE("Unit Of Measure",lrecSalesLine."Unit of Measure Code");
                lrecTmpTransportLine.INSERT(TRUE);
              END
        //.....
      UNTIL lrecTransportLine.NEXT = 0;
    //...
     lcuShipFunct.fctCreateTransactionsAUTLine2(lrecTmpTransportHeader,lrecTmpTransportLine,USERID,'FORM');
    
    


    Codeunit
    fctCreateTransactionsAUTLine2
    WITH precTmpTransportHeader DO
      BEGIN
        lintToPickLeft := 0;
        ldecPalletsBase := 0;
        ldecToPickBase := 0;
    
        lrecInventorySetup.GET;
    
        //met of zonder filters hier te plaatsen werkt dit niet  
        IF precTmpTransportLine.FINDSET THEN 
          REPEAT
             //...
          UNTIL precTmpTransportLine.NEXT=0;
    

    Als ik echter dit plaats dan werkt het wel...
    maar dan ik natuurlijk wel niet filteren.
    WITH precTmpTransportHeader DO
      BEGIN
        lintToPickLeft := 0;
        ldecPalletsBase := 0;
        ldecToPickBase := 0;
    
        lrecInventorySetup.GET;
    
          REPEAT
             //...
          UNTIL precTmpTransportLine.NEXT=0;
    
    [/b]
  • Options
    ajhvdbajhvdb Member Posts: 672
    How are the variables defined? local, global

    Are the "prec" defined as a VAR? in fctCreateTransactionsAUTLine2. And I don't think it needs to be a temp too.
  • Options
    lyotlyot Member Posts: 202
    lrecTmpTransportLine LOCAL TEMP
    precTmpTransportLine LOCAL TEMP
  • Options
    krikikriki Member, Moderator Posts: 9,090
    Maar heb je de boolean "var" aangeklikt voor variable "precTmpTransportLine"? Als je dat NIET doet, dan zend je ENKEL het huidige record naar de functie. Als je dat wel doet, dan zend je de hele temptable door.
    Regards,Alain Krikilion
    No PM,please use the forum. || May the <SOLVED>-attribute be in your title!


  • Options
    lyotlyot Member Posts: 202
    kriki wrote:
    Maar heb je de boolean "var" aangeklikt voor variable "precTmpTransportLine"? Als je dat NIET doet, dan zend je ENKEL het huidige record naar de functie. Als je dat wel doet, dan zend je de hele temptable door.

    Ah... ik dacht dat dit enkel diende als men die variabele/parameter - pass-by refference of pass-by value, ik haal ze telkens door elkaar - wou bewerken in de functie.
  • Options
    krikikriki Member, Moderator Posts: 9,090
    lyot wrote:
    kriki wrote:
    Maar heb je de boolean "var" aangeklikt voor variable "precTmpTransportLine"? Als je dat NIET doet, dan zend je ENKEL het huidige record naar de functie. Als je dat wel doet, dan zend je de hele temptable door.

    Ah... ik dacht dat dit enkel diende als men die variabele/parameter - pass-by refference of pass-by value, ik haal ze telkens door elkaar - wou bewerken in de functie.
    trukje : var = variable = waarde kan VARieren in de functie.

    Als je weet wat er achter de schermen gebeurt, dan is het wel logisch dat het zo werkt met temptables: VAR wil zeggen dat er een POINTER naar de waarde wordt doorgegeven en NIET de waarde zelf => een POINTER naar de temptable en NIET de huidige waarde van het record in de temptable.
    Regards,Alain Krikilion
    No PM,please use the forum. || May the <SOLVED>-attribute be in your title!


  • Options
    lyotlyot Member Posts: 202
    Ah ok, ik dacht dat C/Side per definitie "pass-by value" deed, maw een copie doorgeven van het ganse object (in geval van een table, de ganse table) zonder een pointer bj te houden.
    En dat de parameter VAR dan vervolgens een "pass-by reference" deed, de table doorgeven met een pointer die verwijst naar de oorspronkelijke tabel, zodanig dat alle bewerkingen in de functie dan ook meteen gedaan worden op de brontabel.
    Aangezien ik slechts de tabel wou doorgeven (de waarden) zonder de brontabel te wijzigen dacht ik dat dit kon zonder de parameter VAR te activeren.
    Natuurlijk als ik mijn eigen logica volg moest ik dit toch eens geprobeerd hebben met de parameter VAR :oops:
    Ik heb dit blijkbaar over het hoofd gezien.
    Alvast bedankt voor uw verhelderende uitleg! =D>
  • Options
    krikikriki Member, Moderator Posts: 9,090
    Graag gedaan.
    Regards,Alain Krikilion
    No PM,please use the forum. || May the <SOLVED>-attribute be in your title!


  • Options
    DenSterDenSter Member Posts: 8,304
    lyot wrote:
    Ah ok, ik dacht dat C/Side per definitie "pass-by value" deed, maw een copie doorgeven van het ganse object (in geval van een table, de ganse table) zonder een pointer bj te houden.
    En dat de parameter VAR dan vervolgens een "pass-by reference" deed, de table doorgeven met een pointer die verwijst naar de oorspronkelijke tabel, zodanig dat alle bewerkingen in de functie dan ook meteen gedaan worden op de brontabel.
    Aangezien ik slechts de tabel wou doorgeven (de waarden) zonder de brontabel te wijzigen dacht ik dat dit kon zonder de parameter VAR te activeren.
    Natuurlijk als ik mijn eigen logica volg moest ik dit toch eens geprobeerd hebben met de parameter VAR :oops:
    Ik heb dit blijkbaar over het hoofd gezien.
    Alvast bedankt voor uw verhelderende uitleg! =D>
    Die heb je precies omgedraaid. By value gebruikt alleen de waarde, niet de hele variabele. By Reference stuurt de hele variabele mee, of altans een referentie naar het geheugen waar die variabele wordt bewaard.

    Dus je hebt gelijk, NAV gebruikt als norm By Value, alleen betekent dat precies het andere dan wat je dacht :mrgreen:
Sign In or Register to comment.