Avatar billede morten_s Nybegynder
21. maj 2001 - 14:29 Der er 21 kommentarer og
1 løsning

Syntaks i datofelter

Jeg har oprettet en Pardoxtabel hvor i indgår et felt af typen date.

Når jeg tilskriver feltet foregår det på følgende måde:

FieldByName(\'Dato\').AsDateTime := Date;
Når jeg ser i tabellen med Database desktop
er datoer efter 2000 angivet på følgende måde
  22-10-00
og før 2000 på følgende måde
  22-10-1999

Problemet opstår når jeg skal lave et dataudtræk det gør jeg med feks. følgende syntaks
Form1.Query1.SQL.Text :=\' ( Dato > \'\' 17-11-1999 \'\' )\'

Det giver fejlen Type Mismatch in expression

Kan nogen hjælpe med den rigtige syntaks ??
 

Avatar billede martinlind Nybegynder
21. maj 2001 - 14:39 #1
prøv :

Form1.Query1.SQL.Text :=\' ( Dato > \'\'1999-11-17\'\' )\';

Det plejer at være sådan de vil havde det ( sådan nogle SQL-baser)

/Martin

Avatar billede sjensen Nybegynder
21. maj 2001 - 14:40 #2
sæt variablem \"shortdateformat\" til \'dd-mm-yyyy\' i frmcreate i dit mainform, så vil alle datoer være med 4-cfirede årstal:

shortdateformat := \'dd-mm-yyyy\';
Avatar billede sjensen Nybegynder
21. maj 2001 - 14:44 #3
ups, jeg glemte sql:

Du kan ikke bruge den syntax du viser i sql med et date felt. Du skal bruge et parameter af FtDateTime typen:

Opret et parameter for din query (propertyeditoren, params) og kald det f.eks. for dato1.

Derefter sætter du sql.parambyname(\'Dato1\').asdate := strtodate(\'17-11-1999\'); og kalder dit sqlkald med

... where (dato > :dato1);

Det er muligt at syntaxen omkring parambyname ikke er helt korrekt. Jeg kan ikke huske den sådan lige uden videre.
Avatar billede sjensen Nybegynder
21. maj 2001 - 14:48 #4
Forøvrigt kan du se den rigtige syntax i hjælpen:

Vælg dit Tquery komponent og flyt markøren til property editoren til feltet Params og tryk på F1. Dels hjælpen og dels eksemplet forklarer hvordan du sætter det op.
Avatar billede martinlind Nybegynder
21. maj 2001 - 14:50 #5
Den plejer godt at kunne konvertere en tekst til en date \"on the fly\", så det ikke er nødvendigt at bruge params. Hvis den ikke vil kan du evt. bruge Cast.

Og ja du kan godt bruge

shortdateformat := \'dd-mm-yyyy\';

men sæt den tilbage igen når dit program lukkes, det er det pæneste.

/Martin
Avatar billede morten_s Nybegynder
21. maj 2001 - 14:51 #6
Hej Martin

Prøver med nedenstående, men denne her (SQL dyret)
har åbenbart andre ønsker, kan det være fordi der er poster i databasen som ikke er 4-cifret ?

Form1.Query1.SQL.Text := \'SELECT *FROM DB \'+
                                  \' WHERE ( Dato > \'\'1999-11-11\'\' )\';
Avatar billede sjensen Nybegynder
21. maj 2001 - 14:51 #7
Lige en sidste ting: Datoen i din paradox tabel er i et datefelt blot en float. At den vises kun med 2 cifre for årstallet i dbexplorer eller database desktop skyldes indstillingerne for datoformatet på dinmaskine. I kontrolpanel, nationale indstillinger kan du angive at årstal skal vises med 4-cifre ved at tilføje 2 ÅÅ til angivelsen under det viste datoformat.
Avatar billede sjensen Nybegynder
21. maj 2001 - 14:54 #8
Martinlind, LocalSQL som Delphi benytter til Paradox og Dbase tabeller accepterer ikke konvertering \"on the fly\". Der skal man bruge params, men der er forskel på hvordan disse kan oprettes if hhv. D4 og D5, hvis man opretter og sletter dem igen umiddelbart før og efter et SQL kald. Hvis du bruger params i property er det det samme.
Avatar billede martinlind Nybegynder
21. maj 2001 - 14:55 #9
Jeg mener at kunne huske noget med at du skal bruge CAST og så caste din Dato til en \"ren\" dato og ikke Dato og tid ( TDateTime )

/Martin
Avatar billede martinlind Nybegynder
21. maj 2001 - 14:57 #10
fra Online hjælpen til Local SQL :

Converts specified value to the specified data type.

CAST(column_reference AS data_type)

Description

Use CAST to convert the value in the specified column to the data type specified. CAST can also be applied to literal and calculated values. CAST can be used in the columns list of a SELECT statement, in the predicate for a WHERE clause, or to modify the update atom of an UPDATE statement.

The Data_Type parameter may be one of most column data type applicable to the table type used: CHAR, INTEGER, NUMERIC, and so on. Certain column types cannot be used as the source or target data types: BLOB, MEMO, and BYTES.

The statement below converts a Paradox TIMESTAMP column value to DATE.

SELECT CAST(SaleDate AS DATE)

FROM ORDERS

Converting a column value with CAST allows use of other functions or predicates on an otherwise incompatible data type, such as using the SUBSTRING function on a DATE column.

SELECT SaleDate,

  SUBSTRING(CAST(CAST(SaleDate AS DATE) AS CHAR(10)) FROM 1 FOR 1)

FROM Orders

When applied to retrieved data of a SELECT statement, the effect is transient and does not affect stored data. When applied to the update atoms of an UPDATE statement, the effect is persistent and permanently converts the case of the stored values.

Note:    the CAST function cannot be used with memo or BLOB columns.

/Martin
Avatar billede martinlind Nybegynder
21. maj 2001 - 14:58 #11
og vi kan lige plukke det aktuele ud :

The statement below converts a Paradox TIMESTAMP column value to DATE.

SELECT CAST(SaleDate AS DATE)

Avatar billede sjensen Nybegynder
21. maj 2001 - 15:03 #12
martinlind,

Det ser fint ud, men holder ikke. Cast kan kun bruges i select delen og ikke i where delen
Avatar billede martinlind Nybegynder
21. maj 2001 - 15:12 #13
Ja så er hjælpen jo åbenbart forkert, men det kører nu fint på den Delphi 5 hvor jeg brugte det, har du overvejet at opdatere din BDE.
Avatar billede martinlind Nybegynder
21. maj 2001 - 15:13 #14
og så kan jeg da lige tilføje at det IKKE virkede på den MS SQL server det skulle køre i prod. på, men Local SQL på Pdx det kører bare.
Avatar billede morten_s Nybegynder
21. maj 2001 - 21:00 #15
Det kniber nu stadig med syntaksen har prøvet følgende


Form1.Query1.SQL.Text := \'SELECT *FROM DB \'+
                                  \' WHERE Dato < CAST(FraDato AS DATE) \';


?? /Morten
FraDato er af typen TDate
Avatar billede martinlind Nybegynder
21. maj 2001 - 21:03 #16
hvilken fejl tekst får du ?
Avatar billede morten_s Nybegynder
21. maj 2001 - 22:05 #17
Invalid Field name FraDato
Avatar billede martinlind Nybegynder
21. maj 2001 - 22:24 #18
hvad er det så du ikke forstår ?
Avatar billede morten_s Nybegynder
22. maj 2001 - 07:30 #19
At nedenstående kode giver ovenstående fejl

Form1.Query1.SQL.Text := \'SELECT *FROM DB \'+
                                  \' WHERE Dato < CAST (\'\'1999-11-11 \'\' AS DATE) \';

Jeg har også prøvet med


Form1.QueryAlarm.SQL.Text := \'SELECT *FROM AlDB \'+
                                  \' WHERE Dato < CAST (\'\'11-11-1999 \'\' AS DATE) \';

Hvad går galt ?????
Avatar billede martinlind Nybegynder
22. maj 2001 - 10:09 #20
Her var det feltet 2FraDato\" den ikke kunne lide :

Form1.Query1.SQL.Text := \'SELECT *FROM DB \'+
                                  \' WHERE Dato < CAST(FraDato AS DATE) \';

-----------------------

Skal skrives sådan :

Form1.QueryAlarm.SQL.Text := \'SELECT *FROM AlDB \'+
                                  \' WHERE Dato < CAST (\'1199-11-11\' AS DATE)\';

Husk det er enkelt \' du skal bruge, dvs hvis det skal være i delphi kode så skal du skrive din streng sådan at delphi acceptere \' det er noget med du skal op på tre for at få en ud :
strx := \'sla\'+\'\'\'+\'m\';

/Martin
Avatar billede morten_s Nybegynder
22. maj 2001 - 10:15 #21
Form1.QueryAlarm.SQL.Text := \'SELECT *FROM AlDB \'+
                                  \' WHERE Dato < CAST (\'1199-11-11\' AS DATE)\';

Kan ikke compileres, compiler melder om unterminated string, det kan det neden under og
jeg har checket strengen den oversættes så vidt jeg kan se til  Cast \'1999-11-11\' as date


Form1.QueryAlarm.SQL.Text := \'SELECT *FROM AlDB \'+
                                  \' WHERE Dato < CAST (\'\'11-11-1999 \'\' AS DATE) \';


Dette udtryk kan kompileres men giver fejl ved kørsel ??
Avatar billede martinlind Nybegynder
22. maj 2001 - 10:21 #22
Som jeg forsøgte at skrive skal du bruge tre \' når du skal have det ud midt i en streng, men hvis du går ind og sætter din delphi editor op til at tegne dine strenge i en anden farve end sort så kan du tydeligt se når delphi synes din streng er ok og hvor lang den synes den er, så gør det, og kig så på dit udtryk igen så kan du se problemet.

/Martin
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