* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 19, 2024, 10:45:55 am

Inserisci il nome utente, la password e la durata della sessione.

402 Visitatori, 1 Utente
 

Autore Topic: Allineare tabelle  (Letto 23078 volte)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Allineare tabelle
« il: Febbraio 16, 2014, 09:59:46 pm »
Ciao ragazzi, ho il seguente problema.

Ho due database residenti su macchine diverse e voglio allineare una di queste tabelle. Chiamiato i due database come: db1 e db2 e le tabelle come tab1 e tab2 (ovviamente tab1 e tab2 hanno la stessa struttura ma hanno database diversi).

Ora per evitare di cancellare i dati tutte le volte da tab2 e ricopiarli da tab1 vorrei cancellare e reinserire le righe che davvero vengono modificate).

Mi basta un trigger per le righe inserite o modificate. Ma per le righe cancellate come posso fare? Vorrei evitare di dover cancellarle solo logicalmente.

Suggerimenti?

Grazie mille
Ieri è passato, domani è futuro, oggi è un dono...

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:Allineare tabelle
« Risposta #1 il: Febbraio 17, 2014, 09:33:05 am »
Che Engine usi?

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Allineare tabelle
« Risposta #2 il: Febbraio 17, 2014, 02:30:44 pm »
Io uso Firebird
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Allineare tabelle
« Risposta #3 il: Febbraio 17, 2014, 03:39:27 pm »
devi fare una tabella di log per le eliminazioni

a dire il vero io farei una tabella di log per tutto: insert, update e delete con tanto di progressivo (come PK) per riproporre le sequenza.
nel database di destinazione ti devi segnare l'ultimo progressivo eseguito così alla prossima sincronizzazione riprendi da li.
Imagination is more important than knowledge (A.Einstein)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Allineare tabelle
« Risposta #4 il: Febbraio 17, 2014, 04:58:27 pm »
devi fare una tabella di log per le eliminazioni

a dire il vero io farei una tabella di log per tutto: insert, update e delete con tanto di progressivo (come PK) per riproporre le sequenza.
nel database di destinazione ti devi segnare l'ultimo progressivo eseguito così alla prossima sincronizzazione riprendi da li.

Idea che mi era già frullata in testa. Solo che io quei dati li modifico da una dbgrid e quindi mi rimane difficile da gestire come dici tu. In quanto modificando da tabella non uso delle query da inserire nella tabella di log, e le mie tabelle da allineare hanno PK composte diverse da tabella a tabella.
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Allineare tabelle
« Risposta #5 il: Febbraio 17, 2014, 07:00:15 pm »
il log bisognerebbe gestirlo con un trigger direttamente dentro il database
per quanto riguarda le chiavi composte diverse da tabella a tabella potresti fare così:

1) tabella LOG_MASTER (campi: (1) PK autoincrementale (2) nome tabella di cui si deve replicare il record)
2) tabella LOG_DETAIL_TABLE1 (campo (1) FK autoincrementale  (2..) n. campi come da chiave composta per TABLE 1)
3) tabella LOG_DETAIL_TABLE2 (campo (1) FK autoincrementale  (2..) n. campi come da chiave composta per TABLE 2)
4) tabella LOG_DETAIL_TABLEN (campo (1) FK autoincrementale  (2..) n. campi come da chiave composta per TABLE N)

Nelle tabelle detail, ad esempio TABLE 1, nel trigger after insert, update e delete, fai in inserimento in LOG_MASTER ed uno in LOG_DETAIL_TABLEx

Non è sicuramente una struttura facile, ma dovrebbe essere sufficientemente elastica.
Imagination is more important than knowledge (A.Einstein)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Allineare tabelle
« Risposta #6 il: Febbraio 18, 2014, 03:58:05 pm »
Mi sa che mi richiede più fatica che non cancellarlo logicamente.

Per caso altre idee?!
Ieri è passato, domani è futuro, oggi è un dono...

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:Allineare tabelle
« Risposta #7 il: Febbraio 19, 2014, 01:15:21 am »
Idee che mi vengono al volo.
1)
DELETE * FROM TARGET_TABLE;
SELECT * FROM SOURCE_TABLE;
ALTER TABLE TARGET_TABLE DROP INDEX ....
ALTER TABLE TARGET_TABLE DROP CONSTRAINT ....
Per ogni riga estratta...

INSERT (...) INTO TARGET_TABLE VALUES(...);

Alla fine:
ALTER TABLE TARGET_TABLE ADD CONSTRAINT ....
CREATE INDEX ON TARGET_TABLE ....

Lunghetto e noioso da fare tutto a mano ... :(

Con oracle esistono altri sistemi. Più "eleganti". E si arrangia il motore sql ;)
TRUNCATE TARGET_SCHEMA.TARGET_TABLE;
INSERT INTO TARGET_SCHEMA.TARGET_TABLE VALUE(SELECT * FROM SOURCE_SCHEMA.SOURCE_TABLE);
(Prima devi anche disabilitare gli indici e constraint, in modo che l'insert sia più rapido, poi attivi tutti i costraint e gli indici alla fine... trucchetti da datawarehose).

Firebird non so se supporti questo tipo di sintassi.

E' una logica stupida e va contro la tua richiesta. Ma è quella più semplice da realizzare.
In una banca di cui non ti dico il nome, il riversare i dati da una tabella all'altra era "veloce".
Quando attivavi gli indici si "inchiodava" Oracle ... le cpu schizzavano al 90% .. e stiamo parlando di macchinine di una certa potenza di calcolo. AIX o Solaris dentro Mainframe. ;)
2
(2.1)L'alternativa è tracciare quello che fa l'utente sulla tabella.
Aggiungere un campo con uno "stato". Modificato, Inserito, Cancellato.
Ma poi è una noce lavorare in modo ordinario sulle righe.

Valuta tu.
Questa operazione di ribaltamento deve essere fatta ad ogni operazione o sporadicamente.
(2.2)Nel secondo caso ranza la tabella e caccia tutto dentro senza tante remore.
Se anche ci mette un'oretta (ammesso che la tabella sia molto "piena") l'utente aspetta.

E' un'operazione da fare ad ogni transazione?
Allora l'applicativo deve eseguire le modifiche su entrambe le tabelle.
Configura gli alias e le connessioni in modo fa eseguire una sorta di "raid" se fossero dischi. ;)

3)
Poi anche un export su file ed un import poi, potrebbe essere una soluzione.
Monti una tabella come file csv dalla tabella source.
Copi tutto dentro.
Monti il file come tabella sul db target. Copi tutto dentro sul secondo db.

Poi i file puoi postarli in ftp, per mail, piccione viaggiatore, segnali di fumo. Solo la tua fantasia/pigrizia ti sarà di ostacolo.

Spero di averti confuso le idee più di prima :D

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Allineare tabelle
« Risposta #8 il: Febbraio 19, 2014, 04:09:46 pm »
fbexport o fbcopy
http://fbexport.sourceforge.net/

secondo me è meglio che fai con questi ;)
Imagination is more important than knowledge (A.Einstein)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Allineare tabelle
« Risposta #9 il: Febbraio 19, 2014, 05:37:26 pm »
Alla fine mi sono reso conto che o già due campi che mi permettono di rendere il record inutilizabile dal resto del programma. Quindi alla fine li uso come cancellazione logica (così mi mantiene anche una storicità della cosa) e mi gestisco la modifica e l'inserimento con un trigger. Ho perso del tempo inutilmente insomma.

@Stilgar: avevo pensato anche io che gli indici potessero ridurre notevolmente le prestazioni. Farò delle prove e ti dirò al riguardo.
Ieri è passato, domani è futuro, oggi è un dono...

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Allineare tabelle
« Risposta #10 il: Febbraio 19, 2014, 06:23:38 pm »
Ora però ho bisogno di capire come renderlo fattibile.

Allora ho creato il campo RECORD_EDIT_INSERT SMALLINT attraverso la query:

ALTER TABLE LISTINO_PREZZI_PV ADD RECORD_EDIT_INSERT SMALLINT default 0 not null;

Poi vado per creare il trigger con la seguente sintassi

Codice: [Seleziona]
CREATE TRIGGER MODIFICA_INSERIMENTO_LISTINI_PV for LISTINO_PREZZI_PV
Active
After insert or update
Position 0
AS
BEGIN
     -- ogni volta che inserisco o
     -- modifico un record vado ad
     -- impostare il campo RECORD_EDIT_INSERT
     -- a 1 in modo che nel trasferire i dati
     -- ai punti vendita io trasferisco solo le
     -- righe essenziali
     -- la cancellazione è bloccata dal programma
     -- semplicemente rendo i record non continuativi
     -- e con la data di inizio vendita e di fine vendita
     -- impostata a 1-1-1900

     new.RECORD_EDIT_INSERT=1;

END;

Applico la creazione del trigger ed è ok, quando però applico la commit retaining mi visualizza questo popup

 : CommitRetaining :
 -attempted update of read-only column

Uso Turbobird, sapete cosa può essere? Dove sbaglio?

Inoltre ho un dubbio amletico: quando poi voglio risettare la colonna RECORD_EDIT_INSERT a 0 come posso fare senza che il trigger entri in funzione?
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Allineare tabelle
« Risposta #11 il: Febbraio 19, 2014, 06:57:37 pm »
Inoltre ho un dubbio amletico: quando poi voglio risettare la colonna RECORD_EDIT_INSERT a 0 come posso fare senza che il trigger entri in funzione?

potresti fare la replicazione con una connessione a parte dove ti colleghi con un utente tipo 'XINYREPL'
nel trigger condizioni il codice in modo da essere eseguito solo quando l'utente corrente non è 'XINYREPL'
Imagination is more important than knowledge (A.Einstein)

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Allineare tabelle
« Risposta #12 il: Febbraio 19, 2014, 06:58:50 pm »

Applico la creazione del trigger ed è ok, quando però applico la commit retaining mi visualizza questo popup

 : CommitRetaining :
 -attempted update of read-only column


nella tabella fai uso di campi calcolati?
puoi postare la "create table"?
Imagination is more important than knowledge (A.Einstein)

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Allineare tabelle
« Risposta #13 il: Febbraio 19, 2014, 07:16:01 pm »
Nessun campo calcolato, ecco la create

create table LISTINO_PREZZI_PV (
CHIAVE_PV CHAR(10)  not null ,
ARTICOLO VARCHAR(50)  not null ,
PREZZO_A Numeric(9,2) ,
PREZZO_V Numeric(9,2) ,
VALUTA_A VARCHAR(20) ,
VALUTA_V VARCHAR(50) ,
IDENTIFICATIVO_LISTINO INTEGER not null ,
CATEGORIA VARCHAR(50) ,
IVA FLOAT,
RAGGRUPPAMENTO_ARTICOLO VARCHAR(255) ,
ORDINE_RAGGRUPPAMENTO_ARTICOLO INTEGER,
DATA_INIZIO_VENDITA DATE,
DATA_FINE_VENDITA DATE,
CONTINUATIVO CHAR(1)  default '0',
ID_CATEG_MERC INTEGER,
UTENTE_MODIFICA_RECORD VARCHAR(255) ,
TIPOLOGIA_PRODOTTO CHAR(1)  default '0',
INFO1 VARCHAR(50) ,
INFO2 VARCHAR(50) ,
INFO3 VARCHAR(50) ,
RECORD_EDIT_INSERT SMALLINT default 0 not null
, constraint IX_LISTINO_PREZZI_PV_1 primary key (CHIAVE_PV, ARTICOLO, IDENTIFICATIVO_LISTINO)
);
Ieri è passato, domani è futuro, oggi è un dono...

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2870
  • Karma: +20/-4
Re:Allineare tabelle
« Risposta #14 il: Febbraio 19, 2014, 07:40:46 pm »
non saprei, non ha molto senso
prova a lanciare le stesse istruzioni sql con flamerobin
Imagination is more important than knowledge (A.Einstein)

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18772
  • Topic in totale: 2233
  • Online Today: 578
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 1
Guests: 402
Total: 403

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.