Annoying 4GL problem

Annoying 4GL problem

Post by Mar » Fri, 20 Dec 2002 19:13:59



Hi there

I have a very annoying problem on a 4GL unix system when I try to
print a report.
I have added the 4GL code I use to establish the printing, but
something goes terribly wrong. I really hope there is someone who can
help me.

What happens is the following, whenever I send the data to the report
for the first time, all data is taken into the report and even logged
to the 'bonnen' file. However the data that has to be printed in
group_id 3 is not put in the report.

When I use the same module a second time to print the report, the data
from group_id = 3 is printed.

DATABASE datapool

GLOBALS "comvar.4gl"

.
.
.

FUNCTION afdrukken_leveringsbon ( lv_ritnr, lv_bestellingsnr )
DEFINE  lv_ritnr               LIKE ritregel.ritnr
DEFINE  lv_bestellingsnr       LIKE ritregel.bestellingsnr
DEFINE  lv_bestellingsregelnr  LIKE ritregel.bestellingsregelnr
DEFINE  lr_bestelling          RECORD LIKE bestelling.*
DEFINE  lr_bestellingsregel
          RECORD
            bestellingsnr      LIKE bestellingsregel.bestellingsnr,
            bestellingsregelnr LIKE
bestellingsregel.bestellingsregelnr,
            materiaalnr        LIKE bestellingsregel.materiaalnr,
            materiaalnr_print  LIKE
bestellingsregel.materiaalnr_print,
            geleverd_gewicht   LIKE bestellingsregel.geleverd_gewicht,
            klantsilo          LIKE bestellingsregel.klantsilo,
            mkolom             LIKE bestellingsregel.mkolom
          END RECORD
DEFINE  lr_zakgoed             RECORD LIKE zakgoed.*
{* locaal toevoeg record *}
DEFINE  lr_toevoeg             RECORD LIKE bestel_toevoeg.*
DEFINE  lr_klanten             RECORD LIKE klanten.*
DEFINE  lr_aflever             RECORD LIKE aflever.*
DEFINE  lv_bonnr               LIKE bestellingsregel.bonnummer
DEFINE  lv_tekst_factuurvolgt  LIKE teksten.tekst
DEFINE  lv_tekst_silo          LIKE teksten.tekst
DEFINE  lv_tekst_totaal        LIKE teksten.tekst
DEFINE  lv_materiaalnr         LIKE bestellingsregel.materiaalnr
DEFINE  lv_materiaalnaam       LIKE materiaal.materiaalnaam2
DEFINE  runstring              CHAR(80)
DEFINE  docstring              CHAR(80)
# N.B.: voor de materiaalnaam wordt materiaalnaam2 genomen omdat deze
langer
#       is dan materiaalnaam i.v.m. de buitenlandse talen !!!!!

.
.
.
      LET docstring = "rpt/",lv_bestellingsnr USING "&&&&&&",".rpt"
--    START REPORT rp_leveringsbon TO PIPE gc_leveringsbonprinter
      START REPORT rp_leveringsbon TO docstring

      LET log_tekst = "Afdrukken gestart"
      CALL SchrijfLog("bonnen",FALSE)
      --- Maak in ieder geval een bon aan, ook als we geen regels
zouden vinden.

        OUTPUT TO REPORT rp_leveringsbon ( 0,
                                           lv_tekst_factuurvolgt,
                                           lv_tekst_silo,
                                           lv_tekst_totaal,
                                           lr_klanten.*,
                                           lr_aflever.*,
                                           lr_bestelling.*,
                                           lr_bestellingsregel.*,
                                           lr_toevoeg.*,
                                           lr_zakgoed.*,
                                           lv_bonnr,
                                           lv_materiaalnaam )

      --- Verwerk alle bestellingsregels die bij het meegegeven
bestellingsnr en
      --- ritnr horen.

      DECLARE cr_leverbon_02 CURSOR FOR

        SELECT DISTINCT bestellingsregelnr
        FROM   ritregel
        WHERE  ritnr         = lv_ritnr
        AND    bestellingsnr = lv_bestellingsnr
        ORDER BY bestellingsregelnr

      FOREACH cr_leverbon_02 INTO lv_bestellingsregelnr

        SELECT bestellingsnr,
               bestellingsregelnr,
               materiaalnr,
               materiaalnr_print,
               geleverd_gewicht,
               klantsilo,
               mkolom
        INTO   lr_bestellingsregel.*
        FROM   bestellingsregel
        WHERE  bestellingsnr      = lv_bestellingsnr
        AND    bestellingsregelnr = lv_bestellingsregelnr
        AND    bonnummer          = lv_bonnr
        ORDER BY materiaalnr,
                 klantsilo,
                 bestellingsregelnr

        DECLARE cr_toevoeg_regel CURSOR FOR
        SELECT *
        FROM bestel_toevoeg
        WHERE bestellingsnr=lv_bestellingsnr
        AND bestellingsregelnr=lv_bestellingsregelnr

        IF lr_bestellingsregel.materiaalnr_print <> 0 THEN
          LET lv_materiaalnr = lr_bestellingsregel.materiaalnr_print
        ELSE
          LET lv_materiaalnr = lr_bestellingsregel.materiaalnr
        END IF

        --- Bepaal de naam van het materiaal op basis van de gewenste
taal.

        CALL bepaal_materiaalnaam ( lv_materiaalnr,
                                    lr_klanten.taal )
          RETURNING lv_materiaalnaam

        SELECT SUM(uitgewogengewicht)
        INTO   lr_bestellingsregel.geleverd_gewicht
        FROM   ritregel
        WHERE  ritnr              = lv_ritnr
        AND    bestellingsnr      = lv_bestellingsnr
        AND    bestellingsregelnr = lv_bestellingsregelnr

        LET lr_bestellingsregel.geleverd_gewicht =
               lr_bestellingsregel.geleverd_gewicht -
lr_bestellingsregel.mkolom

        IF lr_bestellingsregel.geleverd_gewicht > 300 THEN

          --- Maak een nieuwe regel met bulkgoed aan in het rapport.

          OUTPUT TO REPORT rp_leveringsbon ( 1,
                                             lv_tekst_factuurvolgt,
                                             lv_tekst_silo,
                                             lv_tekst_totaal,
                                             lr_klanten.*,
                                             lr_aflever.*,
                                             lr_bestelling.*,
                                             lr_bestellingsregel.*,
                                             lr_toevoeg.*,
                                             lr_zakgoed.*,
                                             lv_bonnr,
                                             lv_materiaalnaam )

          --- Zoek de toevoegingen voor de bulkregel.
          LET log_tekst = "Zoeken naar toevoegregels voor: ",
                           lv_bestellingsnr, " - ",
                           lv_bestellingsregelnr
          CALL SchrijfLog("bonnen",FALSE)

          FOREACH cr_toevoeg_regel INTO lr_toevoeg.*
            IF lr_toevoeg.grondstofnr != 0 THEN
            LET log_tekst = "Afdrukken van toevoeging:
",lr_toevoeg.grondstofnr
            CALL SChrijfLog("bonnen",FALSE)
            OUTPUT TO REPORT rp_leveringsbon ( 3,
                                             lv_tekst_factuurvolgt,
                                             lv_tekst_silo,
                                             lv_tekst_totaal,
                                             lr_klanten.*,
                                             lr_aflever.*,
                                             lr_bestelling.*,
                                             lr_bestellingsregel.*,
                                             lr_toevoeg.*,
                                             lr_zakgoed.*,
                                             lv_bonnr,
                                             lv_materiaalnaam )
            END IF
          END FOREACH      
        END IF

      END FOREACH

      CLOSE cr_leverbon_02
      FREE  cr_leverbon_02

      --- Verwerk eventueel zakgoed dat bij het meegegeven
bestellingsnr hoort.

      DECLARE cr_leverbon_03 CURSOR FOR

        SELECT *
        FROM   zakgoed
        WHERE  zakgoed.bestellingsnr = lv_bestellingsnr
        AND    zakgoed.bonnummer     = lv_bonnr
        ORDER BY materiaalnr

      FOREACH cr_leverbon_03 INTO lr_zakgoed.*

        --- Bepaal de naam van het materiaal op basis van de gewenste
taal.

        CALL bepaal_materiaalnaam ( lr_zakgoed.materiaalnr,
                                    lr_klanten.taal )
          RETURNING lv_materiaalnaam

        LET lr_zakgoed.zakhoeveelheid =
               lr_zakgoed.zakhoeveelheid - lr_zakgoed.mkolom

        IF lr_zakgoed.zakhoeveelheid > 0.01 THEN

          --- Maak een nieuwe regel met zakgoed aan in het rapport.

          OUTPUT TO REPORT rp_leveringsbon ( 2,
                                             lv_tekst_factuurvolgt,
                                             lv_tekst_silo,
                                             lv_tekst_totaal,
                                             lr_klanten.*,
                                             lr_aflever.*,
                                             lr_bestelling.*,
                                             lr_bestellingsregel.*,
                                             lr_toevoeg.*,
                                             lr_zakgoed.*,
                                             lv_bonnr,
                                             lv_materiaalnaam )

        END IF

      END FOREACH

      CLOSE cr_leverbon_03
      FREE  cr_leverbon_03

      --- Sluit de bon af.

      FINISH REPORT rp_leveringsbon
      LET runstring = gc_leveringsbonprinter CLIPPED, " ",docstring
CLIPPED
      RUN runstring CLIPPED

    END IF

  END IF

END FUNCTION
.
.
.
.
REPORT rp_leveringsbon ( lv_groep, lv_tekst_factuurvolgt,
lv_tekst_silo,
                         lv_tekst_totaal, lr_klanten, lr_aflever,
lr_bestelling,
                         lr_bestellingsregel, lr_toevoeg, lr_zakgoed,
lv_bonnr,
                         lv_materiaalnaam )
DEFINE  lv_groep               SMALLINT
DEFINE  lv_tekst_factuurvolgt  LIKE teksten.tekst
DEFINE  lv_tekst_silo          LIKE teksten.tekst
DEFINE  lv_tekst_totaal        LIKE teksten.tekst
DEFINE  lr_klanten             RECORD LIKE klanten.*
DEFINE  lr_aflever             RECORD LIKE aflever.*
DEFINE  lr_bestelling          RECORD LIKE bestelling.*
DEFINE  lr_bestellingsregel
          RECORD
            bestellingsnr    
...

read more »

 
 
 

Annoying 4GL problem

Post by Jonathan Leffle » Sat, 21 Dec 2002 15:46:52


Marc wrote:
> I have a very annoying problem on a 4GL unix system when I try to
> print a report.
> I have added the 4GL code I use to establish the printing, but
> something goes terribly wrong. I really hope there is someone who can
> help me.

> What happens is the following, whenever I send the data to the report
> for the first time, all data is taken into the report and even logged
> to the 'bonnen' file. However the data that has to be printed in
> group_id 3 is not put in the report.

This is a very big hunk of code to be posting.  If you're not
interested in the answer (if you didn't ask the question), move on to
the next item...

> When I use the same module a second time to print the report, the data
> from group_id = 3 is printed.

Have you put debug code in to ensure that the FOREACH loop that
generates the group 3 data is actually returning data on the first run?

> DATABASE datapool

> GLOBALS "comvar.4gl"

Is there a global variable in here messing you up?

> .
> .
> .

> FUNCTION afdrukken_leveringsbon ( lv_ritnr, lv_bestellingsnr )
> DEFINE  lv_ritnr               LIKE ritregel.ritnr
> DEFINE  lv_bestellingsnr       LIKE ritregel.bestellingsnr
> DEFINE  lv_bestellingsregelnr  LIKE ritregel.bestellingsregelnr
> DEFINE  lr_bestelling          RECORD LIKE bestelling.*
> DEFINE  lr_bestellingsregel
>           RECORD
>             bestellingsnr      LIKE bestellingsregel.bestellingsnr,
>             bestellingsregelnr LIKE
> bestellingsregel.bestellingsregelnr,
>             materiaalnr        LIKE bestellingsregel.materiaalnr,
>             materiaalnr_print  LIKE
> bestellingsregel.materiaalnr_print,
>             geleverd_gewicht   LIKE bestellingsregel.geleverd_gewicht,
>             klantsilo          LIKE bestellingsregel.klantsilo,
>             mkolom             LIKE bestellingsregel.mkolom
>           END RECORD
> DEFINE  lr_zakgoed             RECORD LIKE zakgoed.*
> {* locaal toevoeg record *}
> DEFINE  lr_toevoeg             RECORD LIKE bestel_toevoeg.*
> DEFINE  lr_klanten             RECORD LIKE klanten.*
> DEFINE  lr_aflever             RECORD LIKE aflever.*
> DEFINE  lv_bonnr               LIKE bestellingsregel.bonnummer
> DEFINE  lv_tekst_factuurvolgt  LIKE teksten.tekst
> DEFINE  lv_tekst_silo          LIKE teksten.tekst
> DEFINE  lv_tekst_totaal        LIKE teksten.tekst
> DEFINE  lv_materiaalnr         LIKE bestellingsregel.materiaalnr
> DEFINE  lv_materiaalnaam       LIKE materiaal.materiaalnaam2
> DEFINE  runstring              CHAR(80)
> DEFINE  docstring              CHAR(80)
> # N.B.: voor de materiaalnaam wordt materiaalnaam2 genomen omdat deze
> langer
> #       is dan materiaalnaam i.v.m. de buitenlandse talen !!!!!

> .
> .
> .
>       LET docstring = "rpt/",lv_bestellingsnr USING "&&&&&&",".rpt"
> --    START REPORT rp_leveringsbon TO PIPE gc_leveringsbonprinter
>       START REPORT rp_leveringsbon TO docstring

>       LET log_tekst = "Afdrukken gestart"
>       CALL SchrijfLog("bonnen",FALSE)
>       --- Maak in ieder geval een bon aan, ook als we geen regels
> zouden vinden.

>         OUTPUT TO REPORT rp_leveringsbon ( 0,
>                                            lv_tekst_factuurvolgt,
>                                            lv_tekst_silo,
>                                            lv_tekst_totaal,
>                                            lr_klanten.*,
>                                            lr_aflever.*,
>                                            lr_bestelling.*,
>                                            lr_bestellingsregel.*,
>                                            lr_toevoeg.*,
>                                            lr_zakgoed.*,
>                                            lv_bonnr,
>                                            lv_materiaalnaam )

>       --- Verwerk alle bestellingsregels die bij het meegegeven
> bestellingsnr en
>       --- ritnr horen.

>       DECLARE cr_leverbon_02 CURSOR FOR

>         SELECT DISTINCT bestellingsregelnr
>         FROM   ritregel
>         WHERE  ritnr         = lv_ritnr
>         AND    bestellingsnr = lv_bestellingsnr
>         ORDER BY bestellingsregelnr

>       FOREACH cr_leverbon_02 INTO lv_bestellingsregelnr

>         SELECT bestellingsnr,
>                bestellingsregelnr,
>                materiaalnr,
>                materiaalnr_print,
>                geleverd_gewicht,
>                klantsilo,
>                mkolom
>         INTO   lr_bestellingsregel.*
>         FROM   bestellingsregel
>         WHERE  bestellingsnr      = lv_bestellingsnr
>         AND    bestellingsregelnr = lv_bestellingsregelnr
>         AND    bonnummer          = lv_bonnr
>         ORDER BY materiaalnr,
>                  klantsilo,
>                  bestellingsregelnr

>         DECLARE cr_toevoeg_regel CURSOR FOR
>         SELECT *
>         FROM bestel_toevoeg
>         WHERE bestellingsnr=lv_bestellingsnr
>         AND bestellingsregelnr=lv_bestellingsregelnr

>         IF lr_bestellingsregel.materiaalnr_print <> 0 THEN
>           LET lv_materiaalnr = lr_bestellingsregel.materiaalnr_print
>         ELSE
>           LET lv_materiaalnr = lr_bestellingsregel.materiaalnr
>         END IF

>         --- Bepaal de naam van het materiaal op basis van de gewenste
> taal.

>         CALL bepaal_materiaalnaam ( lv_materiaalnr,
>                                     lr_klanten.taal )
>           RETURNING lv_materiaalnaam

>         SELECT SUM(uitgewogengewicht)
>         INTO   lr_bestellingsregel.geleverd_gewicht
>         FROM   ritregel
>         WHERE  ritnr              = lv_ritnr
>         AND    bestellingsnr      = lv_bestellingsnr
>         AND    bestellingsregelnr = lv_bestellingsregelnr

>         LET lr_bestellingsregel.geleverd_gewicht =
>                lr_bestellingsregel.geleverd_gewicht -
> lr_bestellingsregel.mkolom

>         IF lr_bestellingsregel.geleverd_gewicht > 300 THEN

>           --- Maak een nieuwe regel met bulkgoed aan in het rapport.

>           OUTPUT TO REPORT rp_leveringsbon ( 1,
>                                              lv_tekst_factuurvolgt,
>                                              lv_tekst_silo,
>                                              lv_tekst_totaal,
>                                              lr_klanten.*,
>                                              lr_aflever.*,
>                                              lr_bestelling.*,
>                                              lr_bestellingsregel.*,
>                                              lr_toevoeg.*,
>                                              lr_zakgoed.*,
>                                              lv_bonnr,
>                                              lv_materiaalnaam )

>      --- Zoek de toevoegingen voor de bulkregel.
>           LET log_tekst = "Zoeken naar toevoegregels voor: ",
>                            lv_bestellingsnr, " - ",
>                            lv_bestellingsregelnr
>           CALL SchrijfLog("bonnen",FALSE)

>      FOREACH cr_toevoeg_regel INTO lr_toevoeg.*
>             IF lr_toevoeg.grondstofnr != 0 THEN

Is this ever non-zero?

>             LET log_tekst = "Afdrukken van toevoeging:
> ",lr_toevoeg.grondstofnr
>             CALL SChrijfLog("bonnen",FALSE)

What does this write to which log file?  Do you see these records in
the log file?

- Show quoted text -

>        OUTPUT TO REPORT rp_leveringsbon ( 3,
>                                              lv_tekst_factuurvolgt,
>                                              lv_tekst_silo,
>                                              lv_tekst_totaal,
>                                              lr_klanten.*,
>                                              lr_aflever.*,
>                                              lr_bestelling.*,
>                                              lr_bestellingsregel.*,
>                                              lr_toevoeg.*,
>                                              lr_zakgoed.*,
>                                              lv_bonnr,
>                                              lv_materiaalnaam )
>             END IF
>           END FOREACH      
>         END IF

>       END FOREACH

>       CLOSE cr_leverbon_02
>       FREE  cr_leverbon_02

>       --- Verwerk eventueel zakgoed dat bij het meegegeven
> bestellingsnr hoort.

>       DECLARE cr_leverbon_03 CURSOR FOR

>         SELECT *
>         FROM   zakgoed
>         WHERE  zakgoed.bestellingsnr = lv_bestellingsnr
>         AND    zakgoed.bonnummer     = lv_bonnr
>         ORDER BY materiaalnr

>       FOREACH cr_leverbon_03 INTO lr_zakgoed.*

>         --- Bepaal de naam van het materiaal op basis van de gewenste
> taal.

>         CALL bepaal_materiaalnaam ( lr_zakgoed.materiaalnr,
>                                     lr_klanten.taal )
>           RETURNING lv_materiaalnaam

>         LET lr_zakgoed.zakhoeveelheid =
>                lr_zakgoed.zakhoeveelheid - lr_zakgoed.mkolom

>         IF lr_zakgoed.zakhoeveelheid > 0.01 THEN

>           --- Maak een nieuwe regel met zakgoed aan in het rapport.

>           OUTPUT TO REPORT rp_leveringsbon ( 2,
>                                              lv_tekst_factuurvolgt,
>                                              lv_tekst_silo,
>                                              lv_tekst_totaal,
>                                              lr_klanten.*,
>                                              lr_aflever.*,
>                                              lr_bestelling.*,
>                                              lr_bestellingsregel.*,
>                                              lr_toevoeg.*,
>                                              lr_zakgoed.*,
>                                              lv_bonnr,
>                                              lv_materiaalnaam )

>         END IF

>       END FOREACH

>       CLOSE cr_leverbon_03
>       FREE

...

read more »

 
 
 

Annoying 4GL problem

Post by Marc Savelsber » Mon, 23 Dec 2002 20:52:08


I am sorry about the big chunk of code, but I thought it was necessary for
anyone toe at least have some idea what I was talking about.

In the mean time, the problem has been solved: there appeared to be some bug
in the (physical) serial line to the printer, that managed to forget to
print the group 3 data. (As you cold see in the code, I have put in some
logging commands, that showed there was data present. Also in the report
file I made from the report, the group 3 data was showing perfectly.

Thank for the trouble to have a look at my problem anyway.

 
 
 

1. A trivial but annoying 4gl question

I have an INPUT ARRAY .. WITHOUT DEFAULTS where I want the user to be
able to modify existing rows but not to enter any new ones. I can inhibit
insert and delete from the middle by redefining the insert and delete
keys, but I can't seem to stop them going off the end with arrow keys and
entering new data there.

I've done this one a dozen times before but I just can't remember how I
did it. Any suggestions please?


------------------------------------------------
Freelance Informix Database Specialist,
Redland, Bristol, England

2. Oracle within a Unix Script

3. Annoying MDX problem ...

4. assigning a Seek or Find to a variable

5. annoying problem using OpenRowset or OpenDatasource

6. Again: Error 75 accessing Btrieve 6.15 on Novell Netware 3.11 from VB5 application?

7. Annoying security problem

8. DOS commands from FOX w/o fox dos window (how?)

9. Very annoying problem

10. SELECT TOP query - Annoying problem

11. Annoying problem please help