Back to top

Autore Topic: [RISOLTO] Aggiornare un campo di una tabella (da locale a remoto o con cronjob)  (Letto 5066 volte)

Offline simone191

  • Nuovo arrivato
  • *
  • Post: 9
    • Mostra profilo
Salve a tutti,
Utilizzo Joomla + Virtuemart e ho un gestionale locale.

Devo aggiornare le quantità degli articoli presenti sul sito con le quantità che risultano sul mio gestionale locale.
Dal DB locale posso esportare il file txt (con separatori) con i campi Codice e Quantità.
Poi dovrei aggiornare solo le quantità sulla tabella del sito.
Ovviamente sul gestionale ci sono tutti gli articoli, mentre sul sito ci sono solo quelli che ho voluto inserire online.
 
Il mio livello di PHP è zero (praticamente non ci capisco di programmazione).

Come posso fare?
 
Il mio hosting mi mette a disposizione il Cron-job tramite il cPanel.

E' possibile utilizzare i txt (o csv prodotti dal mio gestionale) per aggiornare solo le quantità nella tabella sul sito?
Si pùò fare in modo automatico utilizzando i cron-job del server? (Magari caricando periodicamente il file, in formato txt o anche in un altro formato, in una cartella dell'hosting, oppure ri-creareando proprio la tabella aggiornata anche sul web).
Che script si potrebbe usare?
 
Direttamente da locale a remoto è possibile?
 
Ci sono altre soluzioni?


Spiego più dettagliatamente le funzioni di aggiornamento.

Devo sincronizzare/aggiornare il campo "Quantità" tra due tabelle, che hanno in comune solo questi due campi: il "Codice" e la "Quantità", ma solo se il "Codice" coincide in entrambe le tabelle.
 
La Tabella.1 (con le quantità aggiornate). La estraggo dal DB locale del gestionale in formato txt, con i soli due campi che mi interessano: "Codice" e "Quantità".
 
La Tabella 2 è una tabella di Joomla (ovvero Virtuemart) che si trova sul server web dell'hosting e ha molti altri campi tra cui "Codice" e "Quantità".
 
Le Quantità nella Tab.2 devono essere aggiornate con i dati dalla TAB.1
 
Provo a spiegarmi con un esempio.
 
- TAB.1 - estratta in locale
Codice ; QUANTITA'
A1 ; 10
A2 ; 20
A3 ; 30
 
- TAB.2 - Web
...;...;...; CODICE; QUANTITA'; ...
...;...;...; A1 ; 9 ;...
...;...;...; A2 ; 15 ;...
...;...;...; B1 ; 7 ;...
 
Dall'esempio, le quntità di A1 e A2 presenti nella TAB.2 devono essere aggiornate, prendendo le quantità corrispondenti dalla TAB.1. Tutti gli altri campi della TAB.2 devono restare invariati.
Per i codice B1 e A3, che invece non sono presenti in entrambe le tabelle, non deve fare nulla.

Quindi alla fine vorrei avere la Tab.2 sincronizzata (aggiornata) cosi:

- TAB.2
...;...;...; CODICE; QUANTITA'; ...
...;...;...; A1 ; 10 ;...
...;...;...; A2 ; 20 ;...
...;...;...; B1 ; 7 ;...
 
Quindi nella TAB.2 vengono aggiornate le quantità solo per i codici corrispondenti nella Tab.1.
Tutti gli altri campi della Tab.2 restano invariati e non vengono aggiunti/modificati altri record.
 
 
In altre parole...la logica credo che dovrebbe essere (riferito all'esempio di prima):
- La Tab.1 (locale) ha solo due campi: codice e quantità (aggiornata)
- La Tab.2 (sul web) oltre al Codice, ha molti altri campi tra cui il campo quantità (da aggiornare con i dati della Tab.1)
Partendo dal campo "Codice" della Tab.2, se trova lo stesso codice nel corrispondente campo della Tab 1, allora aggiorna la quantità nella Tab.2.
Se non trova il codice nella Tab.1 non modifica niente.
Tutti gli altri campi della Tab.2 restano invariati.
...oppure (che è la stessa cosa)
Partendo dal campo "Codice" della Tab.1, se trova lo stesso codice nel corrispondente campo della Tab 2, allora aggiorna la quantità nella Tab. 2.
Se non trova il codice nella Tab.2 non modifica niente.
Tutti gli altri campi della Tab.2 restano invariati.
 
 
Server Linux
Web server Apache 1.3.42
Versione PHP 5.2.17
Versione Mysql 5.0.91
 
Grazie 1000
« Ultima modifica: 13 Ott 2011, 12:57:05 da simone191 »

mau_develop

  • Visitatore
mi dici la struttura della tua tabella "locale" e quella di vm in cui intendi importare/aggiornare?

devono avere un key comune e univoca per poter fare qs. meglio se un id

M.

Offline simone191

  • Nuovo arrivato
  • *
  • Post: 9
    • Mostra profilo
Ciao mau_develop,
grazie per aver postato,
 
Sono a "digiuno" di DB, quindi sono andato a leggere qualcosa per cercare di capire.
Adesso provo a risponderti (perdona la mia ignoranza o se scriverò cose che non c'entrano con la tua domanda).
 
Dal PhpMyAdmin che ho sull'hosting sono andato sulla tabella (Joomla-Virtuemart - che è jos_vm_product) dove devo aggiornare le quantità.
Da qui vedo che la colonna riferita al codice (il codice che assegno all'articolo nel gestionale locale è lo stesso identico che uso per i prodotti sul sito) è product_sku, mentre la colonna che contiene la quantità da aggiornare è product_in_stock.
 
 
Poi ho esportato la tabella in due formati: CSV e SQL.
 
Esportando in CSV: la colonna che contiene il product_sku è la numero 4 (cioè aprendo con un foglio elettronico corrisponde alla colonna "D"), mentre qualla che contiene product_in_stock è la numero 17 (colonna "Q" nel foglio elettronico)
 
esportando in SQL scrive
`product_sku` varchar(64) NOT NULL default '',
`product_in_stock` int(11) NOT NULL default '0',
 
e più sotto scrive
KEY `idx_product_sku` (`product_sku`),
 

Ti riporto per intero la sruttura della tabella
 
Struttura della tabella `jos_vm_product`
--
CREATE TABLE IF NOT EXISTS `jos_vm_product` (
`product_id` int(11) NOT NULL auto_increment,
`vendor_id` int(11) NOT NULL default '0',
`product_parent_id` int(11) NOT NULL default '0',
`product_sku` varchar(64) NOT NULL default '',
`product_s_desc` varchar(255) default NULL,
`product_desc` text,
`product_thumb_image` varchar(255) default NULL,
`product_full_image` varchar(255) default NULL,
`product_publish` char(1) default NULL,
`product_weight` decimal(10,4) default NULL,
`product_weight_uom` varchar(32) default 'pounds.',
`product_length` decimal(10,4) default NULL,
`product_width` decimal(10,4) default NULL,
`product_height` decimal(10,4) default NULL,
`product_lwh_uom` varchar(32) default 'inches',
`product_url` varchar(255) default NULL,
`product_in_stock` int(11) NOT NULL default '0',
`product_available_date` int(11) default NULL,
`product_availability` varchar(56) NOT NULL default '',
`product_special` char(1) default NULL,
`product_discount_id` int(11) default NULL,
`ship_code_id` int(11) default NULL,
`cdate` int(11) default NULL,
`mdate` int(11) default NULL,
`product_name` varchar(64) default NULL,
`product_sales` int(11) NOT NULL default '0',
`attribute` text,
`custom_attribute` text NOT NULL,
`product_tax_id` int(11) default NULL,
`product_unit` varchar(32) default NULL,
`product_packaging` int(11) default NULL,
`child_options` varchar(45) default NULL,
`quantity_options` varchar(45) default NULL,
`child_option_ids` varchar(45) default NULL,
`product_order_levels` varchar(45) default NULL,
PRIMARY KEY (`product_id`),
KEY `idx_product_vendor_id` (`vendor_id`),
KEY `idx_product_product_parent_id` (`product_parent_id`),
KEY `idx_product_sku` (`product_sku`),
KEY `idx_product_ship_code_id` (`ship_code_id`),
KEY `idx_product_name` (`product_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='All products are stored here.' AUTO_INCREMENT=10 ;
 
 
 
Invece la tabella che estraggo dal data base locale (gestionale) è solo in formato txt (non posso in sql).
Ho un gestionale "adattato" per il quale non ho assistenza (e attualmente non dispongo della password del data base).
Ha una funzione che permette di esportare (solo in formato txt) varie tabelle, scegliendo quali campi.
Quindi esporto la tabella del  magazzino con i campi "Codice" e "Quantità".
Ottengo un file txt con i campi separati dal "punto e virgola".
Quindi ho solo due colonne.
La colonna 1 corrisponde al codice (agli articoli metto lo stesso codice sia nel gestionale che nel sito dove corrispondono al product_sku).
La colonna 2 invece sono le quantità (che corrispondono nella tabella del sito jos_vm_product a product_in_stock).
Se serve, credo di poterla modificare facilmente (aprendola con un foglio elettronico) e salvarla in formato CSV.
 
Ma se è proprio necessario esportare in SQL (con la struttura) posso provare a cercare quello che me lo aveva modificato.
« Ultima modifica: 08 Ott 2011, 11:09:12 da simone191 »

mau_develop

  • Visitatore
no, vabene, era quello che volevo sapere.

quindi in locale hai un file con due soli campi...
`product_sku` varchar(64) NOT NULL default '',
`product_in_stock` int(11) NOT NULL default '0',

dove la key è product_sku`

..giusto?

non è il massimo avere delle key varchar ma si può fare, appena ho due minuti te la scrivo..

M.

Offline simone191

  • Nuovo arrivato
  • *
  • Post: 9
    • Mostra profilo
Ho risolto,
Grazie comunque mau_develop, la tua domanda iniziale:
mi dici la struttura della tua tabella "locale" e quella di vm in cui intendi importare/aggiornare?

devono avere un key comune e univoca per poter fare qs. meglio se un id

M.

mi ha spinto a cercare la soluzione nella giusta direzione.
 
 
Riepilogo il tutto, magari può tornare utile a qualcuno.
 
Ho un vecchio gestionale locale.
Poi ho fatto un sito web e-commerce, ma voglio continuare a utilizzare il vecchio gestionale.
Tutti gli ordini passano da qui, anche quelli che prenderò dal sito web (con il gestionale emetto le fatture e scarico le giacenze di magazzino - gli ordini non arrivano solo dal sito, anzi).
 
Ho quindi necessità di sincronizzare almeno le giacenze degli articoli tra gestionale e sito.
Sul sito ci inserisco parte degli articoli che ho sul gestionale.
Ovviamente gli articoli, che si corrispondono sul gestionale e sul sito, li chiamo con lo stesso codice.

Dal gestionale locale posso esportare solo un file in formato txt.
Ho due campi, Codice e Quantità (separati dal punto e virgola).
Apro il txt con il foglio elettronico e aggiungo una colonna che utilizzerò per il campo product_id.
Prima di salvare, formatto tutte le caselle come TESTO e quindi salvo in formato CSV.
 
Poi con PhpMyAdmin, ho creato la tabella sul data base:
jos_vm_product_agg
La struttura è con 3 campi
-- Struttura della tabella `jos_vm_product_agg`
--
CREATE TABLE IF NOT EXISTS `jos_vm_product_agg` (
  `product_id` int(11) NOT NULL auto_increment,
  `product_sku` varchar(64) NOT NULL default '',
  `product_in_stock` int(11) NOT NULL default '0',
  PRIMARY KEY  (`product_id`),
  KEY `idx_product_sku` (`product_sku`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Quindi i 3 campi hanno la stessa struttura della tabella da aggiornare.

Poi ho utilizzato il file CSV per caricare i dati aggiornati del gestionale nella tabella jos_vm_product_agg (ogni volta che devo aggiornare svuoto e reimporto i dati con il nuovo CSV).

Poi basta eseguire lo Script direttamente dal PhpMyAdmin → seleziona il DB → seleziona la tabella  jos_vm_product → SQL (voce di menu, per eseguire gli script).

Ci scrivo:
UPDATE `jos_vm_product` t1 SET product_in_stock =
(SELECT product_in_stock FROM `jos_vm_product_agg` t2 WHERE t2.product_sku = t1.product_sku)
 
e le quantità sono aggiornate in 0.0004 sec.
Esattamente quello che volevo.

Dovendo entrare in PhpMyAdmin (per aggiornare la tabella jos_vm_product_agg), a questo punto non ha senso impostare il cronjob. Subito dopo lancio lo script ed è fatto l'aggiornamento.
« Ultima modifica: 13 Ott 2011, 13:04:39 da simone191 »

 



Web Design Bolzano Kreatif