Avatar billede friiiiis Novice
24. juni 2013 - 08:39 Der er 9 kommentarer og
2 løsninger

Overføre data fra SQL

Hej,

Jeg henter en række data fra en SQL server og skal så have dem ført videre ind i programmet til visualisering, afrapportering mv. Problemet er hvordan jeg får de data ført ind i programmet "bedst"?

1) Skal jeg overføre data via en funktion der returnere en TADOQuery?

2) SKal jeg lave en specielt indrettete Record klasse hvor data fra SQL serveren så sættes ind i denne record klasse?

3) SKal jeg bygge det op via en TStringlist hvor data så på "en eller anden måde" er lagt ind i TStringlist?

4) Noget andet? Hvad gør i eksperter??
Avatar billede hugopedersen Nybegynder
24. juni 2013 - 09:39 #1
Hvis du 'bare' skal vise data er det vel bare at smide et TDBGrid på en form og så opsætte en passende datsource der selecter dine data og så linke dem.
Hvis du ikke skal/vil rette i data kan griddet sættes til readonly.

Hvis du vil skrive ud er det straks en anden sag. Jeg har aldrig fundet en 'nem' måde der i standard Delphi så jeg gør det via et grid fra DevExpress og så deres udskriftsystem som virker ret godt.
Alternativt er FastReports med i nyere versioner af Delphi - dog i en lidt begrænset version så vidt jeg har kunnet konstatere.
Avatar billede friiiiis Novice
24. juni 2013 - 12:53 #2
hmmm...

Jeg fik det vidst forklaret forkert...

Jeg kalder funktionen A fra en procedure B. Funktionen A laver en SQL forespørgsel for at hente forskellige data.

Hvordan får jeg nu lettest overført data fra Funktionen A til proceduren B? Proceduren B indeholder så forskellige former for behandling af data, visualisering, afrapportering, statistik mv.

1) Skal funktionen A returnere en TADOQuery?
2) Skal funktionen A returnere en Record?
3) Skal funktionen A returnere en TStringList?

Altså, helt generelt - hvordan sender jeg data videre i kildekoden lettest??

Hvordan gør man det smartest??

TDBGrid er ikke en løsning fordi jeg ikke skal have data ud på en form eller lignende - jeg skal bare have dem overført "inde i kildekoden"
Avatar billede hugopedersen Nybegynder
24. juni 2013 - 18:03 #3
Følgende bruger jeg til at læse brugerdata fra en tabel og overføre bruger ID til en combobox
Query := frmUniConn.CreateQuery; er et kald der returnerer en Query (i mit tilfælde en TUniQuery da jeg bruger UniDAC)
Logfile.Error er min egen rutine til at skrive en fejlmeddelelse i en logfil
Det er den metode jeg bruger når jeg tager fat på data der ikke lige skal bruges i en standard datacontrol

procedure TfrmLogon.SetupUser;
var
  Query: TUniQuery;
  UserID: string;
begin
  cboUserID.Clear;
  Query := frmUniConn.CreateQuery;
  try
    Query.SQL.Clear;
    Query.SQL.Add('SELECT flduser_id');
    Query.SQL.Add('      ,flduser_enabled');
    Query.SQL.Add(' FROM ' + TableUsers);
    Query.SQL.Add(' WHERE flduser_enabled = :flduser_enabled');
    Query.ParamByName('flduser_enabled').AsBoolean                  := True;
    Query.SQL.Add('ORDER BY flduser_id');
    try
      Query.Execute;
      while not Query.Eof do
        begin
          UserID := Query.FieldByName('flduser_id').AsString;
          cboUserID.Items.Add(UserID);
          Query.Next;
        end;
    except
      on E:exception do
        begin
          Logfile.Error('F_Logon.SetupUser: ' + E.Message);
          Query.Next;
        end;
    end;
    cboUserID.ItemIndex := 0;
  finally
    Query.Free;
    Application.ProcessMessages;
  end;
end;
Avatar billede arne_v Ekspert
25. juni 2013 - 01:15 #4
Det er vel egentligt mere et spoergsmaal om god programmerings skik end om Delphi.

Den gode OO loesning med loes kobling maa vaere at returnere en collection af objekter.

I Delphi maa det vaere en TList indeholdende instanser af en data klasse som repraesenterer den logiske data struktur.
Avatar billede kroning Nybegynder
25. juni 2013 - 09:22 #5
Jeg plejer at bruge en TClientDataSet

procedure B;
begin
A(ClientDataSet);
end;

procedure A(cds : TClientDataSet);
begin
.
.
end;
Avatar billede friiiiis Novice
27. juni 2013 - 15:50 #6
hmmmm...

Tja, jeg er jo ikke professionel som jer, så lige nogle uddybende grænsende til pinlige spørgsmål:

1) HugoPedersen:  Jeg er med på at du returnere en Query men hvor er din connection? Jeg kan ikke lave en ADOQuery uden ADOConnection? Jeg prøver derefter at "FREE" connection men ikke adoquery i funktionen A og det går ikk' godt... Er det bedre at reurnere et TDatasource?

2) Arne_V: "TList indeholdende instanser af en data klasse" hmmmmm... et simpelt eksempel, tak... ;-)

3) Kroning: Kan jeg retunere et TClientDataSet fra en ADOQuery/ADOConnection hvor jeg så først har Free ADOQuery/ADOConnection?? Har du et simpelt eksempel?
Avatar billede kroning Nybegynder
27. juni 2013 - 19:10 #7
Ja. Du kan bruge en DataSetProvider, dvs.
ADOConnection > ADOQuery > DataSetProvider

DataSetProvider.Dataset sættes til din ADOQuery

eks.
Procedure HentData(CDS : TClientDataSet);
begin
  ADOQuery.Close;
  ADOQuery.SQL.Text:="Din SQL her";

//VIGTIG: husk at poRetainServerOrder    sættes til true i //dataSetProvider ellers bliver der rodet rundt i ordnen

    CDS.Close;
    CDS.SetProvider(DataSetProvider);
    CDS.Open;
    CDS.ProviderName:='';

Du kan nu Free ADOQuery/ADOConnection/DataSetProvider uden at det ændre på indholdet i CDS
Avatar billede hugopedersen Nybegynder
28. juni 2013 - 09:25 #8
Al styring af min connection og den slags ligger i et datamodul som jeg opretter og releaser i min mainform - så har jeg den altid
Hvis jeg skal bruge den på en anden form så user jeg den og sætter connection på komponenterne til frmUniConn.UniServer som er navnet på formen.connectionkomponenten (Uni er igen fordi jeg bruger UniDAC)
Avatar billede friiiiis Novice
30. juni 2013 - 12:14 #9
Hej,

Smid et svar...

Jeg fordeler point med 40 til Hugo, 40 til kroning og 20 til arne_v... Håber det er ok...
Avatar billede hugopedersen Nybegynder
30. juni 2013 - 12:25 #10
Håber du fik løst din opgave
Avatar billede kroning Nybegynder
01. juli 2013 - 08:05 #11
svar..
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