Avatar billede ixus Nybegynder
03. februar 2010 - 11:15 Der er 7 kommentarer

Form, SQL, bombardement

Jeg er pt. i gang med at forsøge en optimering af en form. Formen er ganske simpel. Den inderholde en autogeneret blok, som viser X antal rækker. I form-init, har jeg en #Frm_INDEX(ProjTable) og en efterfølgende #Frm_SEARCH(ProjTable). Ligeså gør formen brug af et filter, som filtere diverse ting fra.

Problemet opstår når jeg opdatere en række i et felt der ikke er indeholdt i indexet. Når jeg forlader linien der er opdateret, begynder C5 at bombardere SQL serveren med forespørgelser.

Update ser således ud:

SQL#1
UPDATE PROJTABLE SET CLOSEPROJECT=? ,LASTCHANGED=?
      WHERE DATASET=? AND ROWNUMBER=?

Så kommer der en SELECT efterfølgende:

SQL#2
SELECT  ROWNUMBER,LASTCHANGED,NUMBER_,SEARCHNAME,CREATED,
    (...), CLOSEPROJECT FROM PROJTABLE WITH
        (FASTFIRSTROW) WHERE DATASET=? AND ROWNUMBER=?

Og så begynder C5 ellers med:

SQL#3:
SELECT  ROWNUMBER,LASTCHANGED,NUMBER_,SEARCHNAME,CREATED,
    (...), CLOSEPROJECT FROM PROJTABLE WITH
        (FASTFIRSTROW)  WHERE DATASET=? AND (NUMBER_>? ) ORDER
        BY DATASET,NUMBER_,ROWNUMBER

Det ser ud til at SQL#3 kommer i samme antal som antallet af rækker der bliver vist i skærmbilledet.

Kan man gøre noget ved SQL#3, man skulle mene engang var nok?
Avatar billede Slettet bruger
03. februar 2010 - 20:04 #1
SQL#3 bliver, som du har gættet, brugt til at finde/vise linier på skærmen.

Der findes en opstarts parametre der muligvis kan ændre mængden af sql:

-zF<f>,<l> Styrer standard metoden ved fremfinding af data i Forms,
            <f>, og List-billeder <l>. Begge parametre kan udelades.
            Følgende værdier er tilladte for <f> og <l>:
              F: Få første record hurtigst muligt (søger først ==).
              A: Få alle records hurtigst muligt (søger >=).
              B: Søger kun én skærmside (blok) ad gangen.
Avatar billede ixus Nybegynder
04. februar 2010 - 10:27 #2
I C5.ini har jeg stående -zFA,A som jeg altid brugt. Jeg har lige så testet de andre varianter, og det gør ingen forskel. SQL serveren bliver stadigvæk bombarderet.
Avatar billede Slettet bruger
04. februar 2010 - 21:27 #3
Du kan jo kode din form via Lookup-triggeren og på den måde selv styre hvilke data der hentes fra serveren.
Avatar billede mariaf Juniormester
05. februar 2010 - 21:08 #4
Filterfunktionen og SQl er en meget lidt god kombination - som du har opdaget.
Få dit filter i et index i stedet.
Avatar billede ixus Nybegynder
09. februar 2010 - 10:35 #5
rahp, ved du om det virker, eller gør nogen forskel på en SQL version?

I øvrigt er det ikke alt der kan lade sig gøre via et index, hvordan vil du f.eks. afgrænse på en beregnet værdi? Det kan umiddelbart ikke løses via index, med mindre man kaster sig ud i en omgang CREIDX.
Avatar billede mariaf Juniormester
09. februar 2010 - 18:52 #6
Lav et databasefelt til værdien, eller smid det hele i et temporært kartotek.
Uanset hvad, så er filter og SQL noget, der fungerer meget dårligt.
Avatar billede Slettet bruger
11. februar 2010 - 22:05 #7
Filter virker lige godt (eller dårligt) på SQL og native. Man skal kun benytte filter hvis det er ganske få poster der skal ikke skal vises.

Så der er vel følgende løsninger:
1) Hæld data i et temp-kart
2) Brug CREIDX
3) Lookup-trigger

- og man kan godt have beregnede værdier i index, når blot hvert database felt kun indgår én gang.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester