Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315

    [delphi] Tabella Interbase compo COMPUTED

    Ciao a tutti,

    su un manuale di Interbase ho trovato questo esempio:
    codice:
    CREATE TABLE persona
    (
    nome VARCHAR(12) NOT NULL,
    cognome VARCHAR (12) NOT NULL
    nome_cognome COMPUTED BY (nome || ", " || cognome), PRIMARY KEY (nome_cognome)
    );
    e specifica che viene calcolato un nuovo campo rappresentato dalla somma del campo nome + il campo cognome.

    sto provando a creare una tabella con questo comando, ma non ci riesco.

    voi lo avete mai fatto?

    e questi campi vengono effettivamente creati occupando spazio su disco?

    grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Non gli ho mai utilizzati (preferisco costruirmi al volo campi di quel tipo, magari direttamente dall'applicazione Delphi), ma la documentazione dovrebbe darti tutte le indicazioni a riguardo.

    E' ovvio che qualsiasi cosa aggiuntiva occupi comunque un proprio spazio su disco, ma io non starei troppo a lesinare sul fattore occupazionale in questi casi: se c'è un'utilità nell'inserire un campo di questo tipo o qualsiasi altra struttura dati, allora vale la pena inserirla.

    Che io sappia, questo genere di campi può risultare utile in certi ordinamenti o nella definizione di indici che devono essere elaborati lato server ma che coinvolgono valori ottenuti da un calcolo effettuato su uno o più campi ("computed", appunto).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    Ciao Alka,

    scusami io non capisco sta cosa,

    cerco di eseguire da ibconsole questo codice...ma ottengo sempre errore.

    codice:
    CREATE TABLE name ( 
    FIRST_NAME VARCHAR(20), 
    LAST_NAME VARCHAR(20),
    FULL_NAME_UPPER COMPUTED BY
    (upper(FIRST_NAME) | " " | upper(LAST_NAME)));
    tale codice l'ho copiato da questo link qui http://www.ibphoenix.com/a474.htm

    credo che potrebbeessermi utile.... una funzione del genere.

    tu riesci a capire xke non funziona?

    forse devo fare qualche aggiornamento, devo allegare qke libreria?...nel caso mi sai dire come devo procedere..


    grazie

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Sostituisci gli apici singoli (') ai doppi apici (").
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    gia avevo provato a sostituirli.
    non sono gli apici.

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Non sono certo, ma di solito io concateno valori usando il doppio carattere pipeline (||), mentre nel listato ne viene riportato solo uno.

    Ad ogni modo, tieni conto che la frase "sto cercando di creare il campo, ma non ci riesco" non offre alcuno spunto sull'errore che ottieni o del perchè non ci riesci: quando si verifica un errore, dovresti indicare anche l'errore, altrimenti è impossibile determinarne la causa.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    sono riuscito a creare il campo computed in questa maniera:
    codice:
    CREATE TABLE TELEFONO1 (
        CODICE     VARCHAR(8) NOT NULL UNIQUE,
        COGNOME    VARCHAR(40),
        NOME       VARCHAR(40),
        FULL_NOME  COMPUTED BY (upper(COGNOME) || ' ' || upper(nome)));
    l'ho creata tramite l'utility IB Expert, con la quale visualizzando la mia tabella e' tutto Ok, il campo full_nome contiene esattamente il valore del cognome+ nome.

    sulla mia form ho una Dbgrid, e in essa ho scritto le dovute opzioni per visualizzare anche il campo FULL_NOME ma il suo valore e' sempre vuoto.

    Un campo COMPUTED puo essere visualizzato in una DbGrid?...intendo visualizzato ovviamente ReadOnly.


    un'anltra domanda:
    tramite IB Expert ho inserito dei valori nella mia tabella. Visto che avevo circa 500 record da inserire in SQL Editor avevo scritto diverse righe in questa maniera:
    codice:
    INSERT INTO TELEFONO (CODICE,COGNOME,NOME,IND,CITTA,CAP,E_MAIL,TEL,TEL1_,TEL2_) VALUES ('00000001','ALLOCCO','SALVATORE  - CATERINA ?','via v. emanuele  - via garibaldi','procida','na','','8968654-ab8969596','cell. caterina 333-9820938','');
    INSERT INTO TELEFONO (CODICE,COGNOME,NOME,IND,CITTA,CAP,E_MAIL,TEL,TEL1_,TEL2_) VALUES ('00000002','LUBRANO','ROCCO','via libert…, 12','','','','8967028','','');
    INSERT INTO TELEFONO (CODICE,COGNOME,NOME,IND,CITTA,CAP,E_MAIL,TEL,TEL1_,TEL2_) VALUES ('00000003','ANASTASIO','ENRICO DR','via libert…','procida','na','','8968485-ab8969986','335/5373991','');

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    SCUSATE, NON AVEVO TERMINATO...HO ERRONEAMENTE INVIATO. RIPRENDO IL MSG.

    sono riuscito a creare il campo computed in questa maniera:
    codice:
    CREATE TABLE TELEFONO1 (
        CODICE     VARCHAR(8) NOT NULL UNIQUE,
        COGNOME    VARCHAR(40),
        NOME       VARCHAR(40),
        FULL_NOME  COMPUTED BY (upper(COGNOME) || ' ' || upper(nome)));
    l'ho creata tramite l'utility IB Expert , con la quale visualizzando la mia tabella e' tutto Ok, il campo full_nome contiene esattamente il valore del cognome + nome.

    sulla mia form ho una Dbgrid, e in essa ho scritto le dovute opzioni per visualizzare anche il campo FULL_NOME ma il suo valore e' sempre vuoto (cioe'non viene visualizzato il valore cognome + nome cosi come se vedo la tabella da IB Expert)

    Un campo COMPUTED puo essere visualizzato in una DbGrid?...intendo visualizzato ovviamente ReadOnly.


    un'anltra domanda:
    tramite IB Expert ho inserito dei valori nella mia tabella. Visto che avevo circa 500 record da inserire in SQL Editor avevo scritto diverse righe in questa maniera:
    codice:
    INSERT INTO TELEFONO (CODICE,COGNOME,NOME) VALUES ('00000001','ALLOCCO','SALVATORE');
    INSERT INTO TELEFONO (CODICE,COGNOME,NOME) VALUES ('00000002','LUBRANO','ROCCO');
    INSERT INTO TELEFONO (CODICE,COGNOME,NOME) VALUES ('00000003','ANASTASIO','ENRICO');
    ma quando eseguo la richiesta IB expert mi restituisce questo errore:
    codice:
    Invalid token.
    Dynamic SQL Error.
    SQL error code = -104.
    Token unknown - line 2, char -1.
    INSERT.
    e l'unica soluzione con cui riesco ad andare avanti e' inserendo una riga di comando per volta.

    cosa che invece non succede se eseguo la stessa cosa tramite IBConsole

    mi sapete dire come posso fare per eseguire piu' riche di comando tramite IBexpert ?

    grazie
    fulvio

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Per quanto ne so, i campi computati sono visibili all'interno delle griglie.

    Come ti dicevo qualche messaggio più indietro, se ti serve a scopo di "indicizzazione", hanno un senso...se invece ti servono solo per "visualizzazione", allora usa un campo calcolato di Delphi.

    Per quanto riguarda l'esecuzione di statement SQL, l'SQL Editor di IB Expert non è uguale a quello di IB Console: l'editor di IB Expert ti permette di inserire uno script soltanto poichè è in grado di visualizzare i record restituiti (nel caso di una query di selezione)...in definitiva, accetta solo script di una sola istruzione.

    Per eseguire uno script più complesso, devi usare la voce di menu Script Executive, che è in grado di rappresentarti in modo grafico anche gli oggetti che vengono creati o alterati, interpretando il contenuto dello script.

    In certi casi, eseguire più script richiede anche la modifica del terminatore di istruzione predefinito (istruzione SET TERM).

    Per chiarirsi le idee, guarda gli script che vengono generati in automatico da IB Expert in base alla tua struttura dati.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    1,315
    Per quanto ne so, i campi computati sono visibili all'interno delle griglie.

    Come ti dicevo qualche messaggio più indietro, se ti serve a scopo di "indicizzazione", hanno un senso...se invece ti servono solo per "visualizzazione", allora usa un campo calcolato di Delphi.
    dopo vari tentativi sono riuscito a visualizzare nella griglia il campo computed.

    a me questo campo servirebbe per l'indicizzazione ma non capisco xke non risco a crearne l'indice:
    codice:
    CREATE INDEX full_nome1 ON telefono(full_nome);
    ....
    ....
    This operation is not defined for system tables.
    unsuccessful metadata update.
    attempt to index COMPUTED BY column in INDEX FULL_NOME1.
    questo indice mi servirebbe per far scorrere, all'utente, la tabella in ordine di Upper(cognome) + Upper(nome)....visto che non e' possibile creare un indice con la funzione UPPER incorporata, avevo pensato di crearmi questo campo e indicizzarlo.


    mi dicevi, poi, che se mi serviva x sola visualizzazione dovevo usare dei campi calcolati in Delphi, come posso fare per assegnare ad una colonna della dbgrid il valore ottenuto dalla somma di 2 altri campi del dataset?...(full_nome = cognome + nome)

    un'altra domanda ancora:
    a dire il vero gia ne parlammo...

    io lascio a l'utente uno spazio in cui lui puo scrivere delle parole che verrano ricercate indistintamente in tutti i campi della tabella tramite una SELECT.

    cosa succede:

    es.:

    l'utente inserisce '001003' cioe un valore di 6 caratteri...

    nel momento in cui ricerchero questo parametro all'interno di un field di lunghezza inferiore a 6 si ottiene errore.

    come soluzione proposi di troncare il valore del parametro, rendendolo di lunghezza uguale a quella del field,...in questo modo almeno non si sarebbe avuto errore, ma ne viene falsato il risultato.

    Tu mi puoi indicare una strada piu pratica? forse tra i tanti casi ne hai risolto anke uno simile...

    grazie 1000!
    fulvio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.