Nedenstående er en bug, jeg har fundet på alle versioner af C5 SQL over 3 (seneste jeg har testet er v.4SP1).
Ved en afvikling af en ganske almindelig søgeløkke fx: SEARCH FinPost PRINT BeløbDKK END
afvikler C5 Init-triggeren for hver eneste FinPost den finder! For nu at gøre det værre, vælter den med et hult drøn, hvis der ligger makroer i Init-triggeren - hvis det er en makro der returnerer en dato, fejler den med ugyldigt datoformat; ved højrestillede strenge fejler den med Right Truncation.
Problemet er gældende for alle kartoteker - også specialoprettede.
Spørgsmålet lyder så: Er der noget man kan gøre for at slå afviklingen af Init-triggeren fra på Search-løkker? Jeg forstår slet ikke den 'feature'. Hvorfor sætte standardværdier i et gennemløb af eksisterende poster?
Jeg er også rendt ind den. Rådet er at holde sig til enkelte SET kommandoer i TRG.Init-record for at holde performance og så afvikle mere komplekse ting i TRG.Insert eller i formens Init-Record.
Når kernen opstiller en buffer internt, så kalder den Init-record uanset hvad. Den gør det samme ved en INTRODUCE med direkte opslag, mener jeg.
Måske kan #DisableDbXal / #EnableDbXal hjælpe dig?
P.S. Jeg er 100% enig i, at det ikke giver mening at den kalder triggeren.
Synes godt om
Slettet bruger
03. oktober 2007 - 20:28#3
DisableDbXal har vi haft problemer med, fordi det kun virker i nogle tilfælde (og rapporter er et af de tilfælde, hvor den ikke gør).
Problemet er at vi snakker en temmelig omfattende brancheløsning og gennemgå alle de steder, hvor vi laver en Introduce, for at sætte standardværdier er fuldstændig uoverskueligt. Derudover skal alle skærmbilleder, der bruger blokkene ændres. Vi bruger en del parameter-/brugeropsatte værdier igennem hele programmet til standardværdier.
Har du prøvet at sende en bug-rapport til MS? Virker som en af de større uhensigtsmæssigheder som burde koste en SP.
Synes godt om
Slettet bruger
04. oktober 2007 - 10:56#4
Bare til yderligere info, fyrer Init-triggeren også i Native...
Jeg har lavet lidt yderligere tests: XAL’en ser således ud:
SEARCH FinKart PRINT SaldoDKK END PAUSE
Og så har jeg sat en IF NOT Løbenummer THEN PRINT Konto PRINT Løbenummer PAUSE ENDIF
Når jeg afvikler kørslen, kommer mine printsætninger således ud: "" 0 (Pause) "" 0 (Pause) "" 0 (Pause) "" 0 (Pause) 1.000,00 1.500,00 2.000,00 (Pause)
Hvis jeg fjerner post nr. 2, ser det således ud: "" 0 (Pause) "" 0 (Pause) "" 0 (Pause) 1.000,00 2.000,00 (Pause)
Dvs. at i selve afviklingen af SEARCH-løkken, fyrer Init-triggeren i alt 1 gang mere end det antal poster der bliver ramt af SEARCH-løkken.
En umiddelbar plausibel forklaring kunne være, at Microsoft har valgt at håndtere databaser således:
1. Oprette et midlertidigt objekt i hukommelsen dannet ud fra kartotekets skabelon (kald af init-trigger) 2. Kald af databasen med SELECT statement for hvor mange rækker der er påvirket - for hver række, der returneres, oprettes et nyt objekt til at håndtere næste record (igen et kald af init-triggeren). 3. Når alle objekter er oprettet, kaldes databasen med SELECT statementen som returnerer data og objekterne fyldes med data herfra (fyrer ikke en init-trigger, da objektet allerede er oprettet).
Jeg har prøvet med #DisableDbXal kommandoen - dette hjælper ikke, da disse objektoprettelser stadig kalder Init-triggeren.
Det er en simpel buffer på heapen, der oprettes til at indeholde recorden - der findes ikke een linie objektorienteret kode i kernen. Det blev jo skrevet i slutningen af 80'erne.
Bufferen bliver nulstillet og genbrugt fra record til record i SEARCH'en - der vil simpelthen være alt for meget overhead i at allokere og deallokere den for hver record. Men efter nulstillingen kaldes TRG.Init-record.
Synes godt om
Slettet bruger
04. oktober 2007 - 12:45#6
Sorry, dårlig formulering - når jeg skriver objekt mente jeg buffer. Men jeg tror ikke helt din forklaring holder vand, fordi triggeren bliver fyret 4 gange _inden_ koden bliver afviklet i search-løkken, hvilket vil sige at koden inde i search-løkken kun ville have adgang til den seneste record i bufferen. (kan også bare være en finurlighed omkring hvordan C5 i praksis timer det).
Jeg synes ikke lige at jeg kan få min native kerne til at gøre det...
Synes godt om
Slettet bruger
04. oktober 2007 - 14:53#9
Hmm... nu da jeg ville genteste det i Native, sker det kun en gang.
Ligenu kører den Init-triggeren en gang.
Jeg tester således: Sætter en printsætning ind i TRG.FinKart.Init ved løbenummer 0. Kører en kontoplan. Efter kontoplanen er løbet igennem alle knoti, kommer print-sætningen.
Build: 4.00SP0 #10 HF005 03052006 (vores udvikling af brancheløsningen er ikke helt up-to-date) Opstartsparametre: -cDK -$Cus/xxxxxxx -h
Jeg tror ikke jeg testede godt nok - tror det er rapporten der gør noget til sidst i native. Kan ikke genskabe problemet i en XAL-kørsel.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.