Avatar billede koonz Nybegynder
19. februar 2001 - 21:16 Der er 16 kommentarer og
1 løsning

Lidt kringlet sql

Jeg har 2 tabeller

elementnumre, og type template.

ud fra de 2, skal jeg genere et grid med signalnummer og Elementnummer.Beskrivelse + TypeTemplate.Beskrivelse.

I elementnumre slår jeg værdien Nummer 23041111 og ser at det er typen 401, samt en beskrivelses tekst.

Når jeg slår op i min type tabel, består den (typen, her 401) altid af 8 cifre XXXXXXXX , de tal der er udfyldt med andet end X skal udfyldes af element nummerets samme plads, står der eks. 45X4XXXX, skal mit grid ende ud med
45041111 + den sammentrukne beskrivelse

Jeg håber det er forståligt, ellers skal jeg prøve at illustrere det...

 
Avatar billede xafion Nybegynder
19. februar 2001 - 21:43 #1
Hej. Skal du have hjælp til at lave SQL queries eller til Delphi/SQL samarbejde?
Avatar billede koonz Nybegynder
19. februar 2001 - 21:46 #2
Til at lave den pågældende sql qry i delphi, det er bare sådan af fritids interesse
Avatar billede koonz Nybegynder
19. februar 2001 - 21:48 #3
SOm jeg lige kan se det må det være noget med at Join\'e og AS\'e, jeg er bare ik lige flyvende i det :)
Avatar billede xafion Nybegynder
19. februar 2001 - 21:52 #4
Er det ikke bare at tildele en variabeler? og så lave et grid udfra dem ...  Jeg har ikke en skid styr  på left outa join osv.    Jeg ville gøre det på den måde..

PS. Hvis du brugte VB kunne jeg give dig et eksempel
Avatar billede koonz Nybegynder
19. februar 2001 - 21:57 #5
hmn.......Ikke helt, og det er jo delphi...sååh, jeg har brygget det sammen i Access, skal egentlig bare have det oversat :)
Avatar billede xafion Nybegynder
19. februar 2001 - 22:08 #6
:)
Avatar billede pellelil Nybegynder
19. februar 2001 - 22:26 #7
koonz>Prøv at beskrive din tabel definition (hvilke felter er i hvilke tabeller) samt et eksempel på hvordan resultatet skal se ud.

Evt. som
Tabel1:
FeltA Integer
FeltB Char(20)
FeltC Integer

Table2:
FeltA Integer
FeltB Char(20)
FeltC Integer

Grid:
Tabel1.FeltA, Tabel1.FeltC, Tabel2.FeltA

eller lign !?

Avatar billede xafion Nybegynder
19. februar 2001 - 22:30 #8
Me 2...  Jeg kunne overhovedet ikke overskue spørgsmålet..
Avatar billede shanders Nybegynder
20. februar 2001 - 11:28 #9
Ok denne her bliver lidt tricky ! Glem alt om SQL !

Du skal bruge 2 * TADOTable i Delphi som tilføjes til din form eller datamodul.

TableElementnumre: TADOTable;
TableType_Template: TADOTable;

Specifiser \'Conection\' og \'ConnectionString\' for begge således at de tilgår de rigtige tabeller i din Access DB.

Sæt \'AutoCalcFields\' = False i TableElementnumre.

Hvis du i design vinduet DBKlikker på TableElementnumre får du en liste over tilgængelige felter (denne skulle helst være tom)

Højreklik på listen og vælg \'Add fields\' vælg derefter de felter som du ønsker at bruge dvs: Nummer, Typen og beskrivelse.

Højreklik igen på listen og vælg \'New field\' og sæt følgende :
Name til \'Type_TemplateBeskrivelse\',
Type og size til samme format som Type_Template.Beskrivelse,
field type til \'Lookup\',
Key Fields til Typen, (i TableElementnumre)
Dataset til TableType_Template,
Lookup Keys til Typen, (i TableType_Template)
Result Field til Beskrivelse. (i TableType_Template)

!! Du har nu fået tilføjet et felt Type_TemplateBeskrivelse i TableElementnumre !!

Højreklik igen på listen og vælg \'New field\' og sæt følgende :
Name til \'Type_TemplateNummer\',
Type og size til samme format som Type_Template.Nummer, (8 cifre?)
field type til \'Lookup\',
Key Fields til Typen, (i TableElementnumre)
Dataset til TableType_Template,
Lookup Keys til Typen, (i TableType_Template)
Result Field til Nummer. (i TableType_Template)

!! Du har nu fået tilføjet et felt Type_TemplateNummer i TableElementnumre !!

Højreklik igen på listen og vælg \'New field\' og sæt følgende :
Name til \'Signalnummer\',
Type og size til samme format som TableElementnumre.Nummer,
field type til \'Calculated\'.

!! Du har nu fået tilføjet et felt Signalnummer i TableElementnumre og har nu følgende felter:

Nummer
Typen
beskrivelse
Type_TemplateBeskrivelse
Type_TemplateNummer
Signalnummer

!! nu mangler vi bare at beregne resultatet i signalnummer !!

Luk felt listen !
Vælg TableElementnumre !
vælg Events !
DBKlik på OnCalcFields og indsæt følgende kode :

var TempString, TempString: String; i: Integer;
begin
  OldString := Type_TemplateNummer.Text;
  i := Pos(\'X\',OldString);
  While i <> 0 do
  Begin
    TempString := Copy(Nummer,i,1);   
    Delete(OldString,i,1);
    Insert(TempString,OldString,i);
    i := Pos(\'X\',OldString);
  end;   
  TableElementnumreSignalnummer.text := OldString;
end;

Overstående kode skulle erstatte samtlige \'X\'er i  Type_TemplateNummer med en karakter på tilsvarende plads i Nummer og gemme resultatet i signalnummer :)
Avatar billede koonz Nybegynder
20. februar 2001 - 13:14 #10
TADOTable......hmnn....Hva er det for en sag, vi snakker Delphi ikke ?

Men ellers kan jeg godt se hvor du vil hena, jeg prøver lige at kigge lidt på det når jeg kommer hjem :)
Avatar billede shanders Nybegynder
20. februar 2001 - 14:15 #11
Ved at bruge ADO slipper du for at opsætte dns, hele forbindelsen defineres af din connectionstring meget lig ASP. Eks.:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=O:\\ACCESS\\DATABASE.mdb;Persist Security Info=False

Provider sættes eks. til Microsoft.Jet.OLEDB.4.0

Connection bruges hvis du bruger en TADOConnection som den så linker til, men så skal Connectionstring i stedet defineres på denne.
Avatar billede bustermaniac Nybegynder
20. februar 2001 - 14:49 #12
Desværre er det vidst kun Delphi 5 der har indbyggede mulighed for ADO med mindre man gør følgende:

tilføj ComObj til din uses clause. Der er en funktion kaldet CreateOleObject(objekt:string) som returnerer en Olevariant. Du angiver hvilket ADO objekt du vil bruge (d.v.s. der er ingen visuelle tabels til at hjælpe men du får fuld adgang til ADO). I store træk er det nu muligt at gøre som shanders siger du skal bare selv skrive koden der forbinder ADO objekterne med dine tabels (evt. TStringrid funker fint her).

Hvis du har problemer så tjek den gode side www.delphizine.com og søg på ADO (½ af artiklerne handler om D5, men der er to som fortæller om hvordan du bruger ADO i f.eks. D3). Ellers så tjek www.microsoft.com/data for både at hente nyeste udgave af ADO (i pakken MDAC). Der er inkluderet en rigtig god hjælp med ADO og du kan ellers tjekke stort set alle hjemmesider der handler om Active Server Pages - fremgangsmåden til at bruge ADO der er næsten det samme som her.

ADO styrer :)

Mark Gray alias BusterManiac
Avatar billede koonz Nybegynder
20. februar 2001 - 15:57 #13
Okay, nu forstår jeg sammenhængen da jeg er i Delphi 4, men nu synes jeg, det er ved at være ude i noget, jeg ikke ønsker at rode med PT.

Det må kunne laves i D4, med en sql. Da jeg også ønsker at lave ligende ting i fremtiden, altså med at join\'e og bruge AS.

Men kan jeg ikke bare oprette et ekstra felt på min TTable, og så bruge OnCalcFields, til at hente de rigtige ting ud af mine andre kolonner - og fylde ind i min definerede det skal IHF prøves...
Avatar billede nazaq Nybegynder
20. februar 2001 - 16:54 #14
Nu skriver du du har lavet det i Access, men er det sådan at du vil lave det på en SQL database som ikke behøver at være access?
Avatar billede koonz Nybegynder
20. februar 2001 - 18:32 #15
Nej det skal laves op mod en Access database
Avatar billede koonz Nybegynder
20. februar 2001 - 19:10 #16
SELECT IIf([SignalTemplate].[SignalNummer]=\'XXXXXXXX\',
      [Elementer]![ElementNummer],
      Left$([SignalTemplate].[SignalNummer],2) & Mid$([ElementNummer],3,1) &
      Mid$([SignalTemplate].[SignalNummer],4,1) & Mid$([ElementNummer],5,4))
      AS Signal, Elementer.GlNr, [Elementer].[Beskrivelse] & \' \' & [Tillægstekst]
      AS Beskrivelse, Elementer.Type, Elementer.PLC, Elementer.ModulNummer,
      Elementer.LøbeNummer, Elementer.ElementNummer, SignalTemplate.SignalNummer
FROM  Elementer LEFT JOIN SignalTemplate ON Elementer.Type = SignalTemplate.Type
ORDER BY Elementer.ModulNummer, Elementer.LøbeNummer;

Det er den sætning jeg fyrer af på databasen, og det virker da også hvis jeg laver den i \"Strings\" på min query, men oversætter jeg den som

with qrySignaler do
  begin
    Close;
    sql.Add(\'SELECT IIf([SignalTemplate].[SignalNummer]=XXXXXXXX,\');
    sql.Add(\'        [Elementer]![ElementNummer],\');
    sql.Add(\'        Left$([SignalTemplate].[SignalNummer],2) & Mid$([ElementNummer],3,1) &\');
    sql.Add(\'        Mid$([SignalTemplate].[SignalNummer],4,1) & Mid$([ElementNummer],5,4))\');
    sql.Add(\'        AS Signal, Elementer.GlNr, [Elementer].[Beskrivelse] \'+\' \'+\'[Tillægstekst]\');
    sql.Add(\'          AS Beskrivelse, Elementer.Type, Elementer.PLC, Elementer.ModulNummer,\');
    sql.Add(\'        Elementer.LøbeNummer, Elementer.ElementNummer, SignalTemplate.SignalNummer\');
    sql.Add(\'FROM      Elementer LEFT JOIN SignalTemplate ON Elementer.Type = SignalTemplate.Type\');
    sql.Add(\'ORDER BY  Elementer.ModulNummer, Elementer.LøbeNummer\');
    open;
  end;


Ja så får jeg en fejl - noget med en karakter uden for sql strengen
Avatar billede koonz Nybegynder
20. februar 2001 - 22:13 #17
Fandt løsningen, og lavede selecten direkte på qry, og så valgte ud med Params
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
Kurser inden for grundlæggende programmering

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