Avatar billede megabyte_ Nybegynder
14. september 2000 - 13:49 Der er 13 kommentarer og
1 løsning

Sql

Hey

Jeg skal bruge en ting der kan læse en database i gennem og se om at det nummer som man er ved at tilføje er i den.

jeg har er paradox database men
id <-- bliver brugt til noget på en hjemmme side (p key)
varenummer <-- det er den den skal se om findes engang
varenavn

men hvordan får jeg får jeg den til at se efter nå man op retter en nu vare i mit prog om der findes en anden post med samme varenummer

<MB>
Avatar billede tknudsen Nybegynder
14. september 2000 - 13:57 #1
hvis du inden du opretter den (måske) nye post søger efter det nye varenummer kan du finde ud af om du skal inserte eller update:

Q.SQL.Add(\'SELECT * FROM Table_Name WHERE varenummer = :pVareNr\');
Q.PAramByName(\'pVareNr\').AsString := \'VARE001\';
Q.Open;

if Q.RecordCount = 0 then
begin
  Q.Close;
  Q.SQL.Clear;
  Q.SQL.Add(\'INSERT INTO Table_Name.....\');
  Q.ExecSQL;
end
else
begin
  Q.Close;
  Q.SQL.Clear;
  Q.SQL.Add(\'UPDATE Table_Name SET... WHERE varenummer = :pVareNr\')
  Q.PAramByName(\'pVareNr\').AsString := \'VARE001\';
  Q.ExecSQL;
end;

...eller noget i den stil...
Avatar billede sjensen Nybegynder
14. september 2000 - 14:08 #2
Vær opmærksom på at en søgning som tknudsen så rigtigt har foreslået, kan tage noget tid, afhængig af hvormange records der er i db\'en.

Desuden ville jeg nøjes med \"select varenummer from...\" og ikke select * from ...\" som tknudsen foreslår.

Avatar billede tknudsen Nybegynder
14. september 2000 - 14:15 #3
hva\' kan man si\'e :)

Jeg synes faktisk at det er underligt at der ikke findes en sql cmd som selv gør det-der. Feks kunne insert jo godt lige tage en parameter som feks hed updateifexists. Måske et forslag til næste ersion (hvis den nogensnde kommer i en ANSI udgave:-)
Avatar billede megabyte_ Nybegynder
21. september 2000 - 08:53 #4
Okey det er jo meget fint men hvorfor virker det her så ikke :(

main.Query1.SQL.Add(\'SELECT * FROM produkt WHERE varenummer = :pVareNr\');
main.Query1.PAramByName(\'pVareNr\').AsString := \'VARE001\';
main.Query1.Open;
if main.Query1.RecordCount = 0 then
  begin
  with main.Query1 do
  begin;
    close;
    SQL.Clear;
    SQL.Add(\'insert into produkt(varenummer, varenavn, pris, Lagerbeholdning, varebeskrivelse)VALUES(:varenummer, :varenavn, :pris, :lagerbeholdning, :varebeskrivelse)\');
    Params[0].AsInteger := strtoint(nyvare.Edit1.Text);    //varenummer
    Params[1].AsString  := nyvare.Edit2.Text;              //varenavn
    Params[2].AsString :=  nyvare.Edit3.Text;              //pris
    Params[3].AsInteger := strtoint(nyvare.Edit4.Text);    //Lagerbeholdning
    Params[4].AsString  := nyvare.Memo1.Lines.Text;        //varebeskrivelse
    ExecSQL;
  end;
  end
else
  begin
  showmessage(\'bla\');
  end;
main.lagerRxQuery.Close;
main.lagerRxQuery.open;
close;

den siger \"type mismatch in expression\"

<MB>
Avatar billede sjensen Nybegynder
21. september 2000 - 09:13 #5
er de 5 parametre (0-4) oprettet som parametre i TQuery komponenten (i params property) ?

og har de samme type som du har defineret ?

Hvis ja, så prøv at flytte de 5 params[x].as... linier op før sql.add linien

Hvor er det den siger \"type mismatch..\" ?

Prøv evt. med at sætte showmessage(\'1\'); (og 2, og 3 o.s.v.) ind som linier mellem de enkelte linier i koden. Så vil du kunne se hvad den sidste showmessage er inden du får fejlen.
Avatar billede megabyte_ Nybegynder
21. september 2000 - 09:34 #6
Første fejl er lige før i linjen der heder if main.Query1.RecordCount = 0 then main.Query1.open;
type mismatch in expression igen :)

og ja der er params 0-4 :)

<MB>
Avatar billede martinlind Nybegynder
21. september 2000 - 09:58 #7
Du kan med fordel køre Prepare inden du tilskriver dine params. også evt. bruge paramByName så er du sikker på at det er det rigtige param du har fat i og så skal du huske at hvis du tilskriver et parameter AsString tror Query\'en at det er en string og så skal der \'\' rundt om i SQL sætningen, så hvis varenummer er integer så konverter inden du tilskiver eller brug AsInteger, eller sæt Param.Datatype ( tilskrivning af datatype sletter indholdet at din param )

/Martin

PS. du kan også vælge at bygge dit SQL sætning op i en string i steddet for params.
Avatar billede megabyte_ Nybegynder
21. september 2000 - 11:04 #8
well det med at den skal gemme dataen i databasen virker men den skal jo lige se efter om det varenummer er der en gang.

procedure Tnyvare.BitBtnWithColor1Click(Sender: TObject);
begin
main.Query1.SQL.Add(\'SELECT * FROM produkt WHERE varenummer = :pVareNr\');
main.Query1.PAramByName(\'pVareNr\').AsString := \'VARE001\';
main.Query1.open;
if main.Query1.RecordCount = 0 then
  begin
  with main.Query1 do
  begin;
    close;
    SQL.Clear;
    SQL.Add(\'insert into produkt(varenummer, varenavn, pris, Lagerbeholdning, varebeskrivelse)VALUES(:varenummer, :varenavn, :pris, :lagerbeholdning, :varebeskrivelse)\');
    Params[0].AsInteger := strtoint(nyvare.Edit1.Text);    //varenummer
    Params[1].AsString  := nyvare.Edit2.Text;              //varenavn
    Params[2].AsString  := nyvare.Edit3.Text;              //pris
    Params[3].AsInteger := strtoint(nyvare.Edit4.Text);    //Lagerbeholdning
    Params[4].AsString  := nyvare.Memo1.Lines.Text;        //varebeskrivelse
    ExecSQL;
  end;
  end
else
  begin
  showmessage(\'Varenummer findes\');
  end;
main.lagerRxQuery.Close;
main.lagerRxQuery.open;
close;
end;


tror det er i det her den melder fejl

main.Query1.SQL.Add(\'SELECT * FROM produkt WHERE varenummer = :pVareNr\');
main.Query1.PAramByName(\'pVareNr\').AsString := \'VARE001\';
main.Query1.open;
if main.Query1.RecordCount = 0 then

well det er hele den code den udføre håber i kan hjælpe mig

<MB>

Avatar billede martinlind Nybegynder
21. september 2000 - 11:11 #9
Hvad er DataTypen på Varenummer ?? hvis det er en string så skal SQL se sådan ud :

\'SELECT * FROM produkt WHERE varenummer = \'\':pVareNr\'\'\');

/Martin

PS. Husk evt. Query.SQL.Clear; inden SQL.Add
Avatar billede martinlind Nybegynder
21. september 2000 - 11:13 #10
Hvis du stadig har problemer, så mail en Lille base og din source til mig så skal jeg se på det

/Martin
arb@lind-sonne.dk
Avatar billede tknudsen Nybegynder
21. september 2000 - 11:22 #11
det som er skrevet er et eksempel - erstat evt. pVareNr med en anden datatype - feks hvis vare typen er integer:

main.Query1.SQL.Add(\'SELECT * FROM produkt WHERE varenummer = :pVareNr\'); main.Query1.PAramByName(\'pVareNr\').AsInteger := 1;

desuden skal der \'er uden om :pVareNr hvis data typen er en streng:
main.Query1.SQL.Add(\'SELECT * FROM produkt WHERE varenummer = \'\':pVareNr\'\'\');

good luck...
Avatar billede tknudsen Nybegynder
21. september 2000 - 11:24 #12
forpulede notes server...

sorry martinlind - det er ikke for at gi den som gymnasie elev - men jeg fik først lige opdateret siden nu :-|

godt svar iøvrigt :-)
Avatar billede martinlind Nybegynder
21. september 2000 - 11:29 #13
tknudsen > Ok *S*
Avatar billede megabyte_ Nybegynder
25. oktober 2000 - 08:45 #14
Soory jeg havde helt glemt dette spm :)
well er færdig med det projekt nu
mange tak for hjælpen

<MB>
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