Problema Tabella

di il
45 risposte

45 Risposte - Pagina 2

  • Re: Problema Tabella

    Ciao Franco, siamo leggermente OT ma la logica è questa: nella tabella anagrafica articoli, chiaramente siamo in riga, in quanto codarticolo = key univoca e il campo descrizione articolo = max 36 caratteri.

    Nella tabella delle descrizioni in lingua (vedi sotto), potresti scrivere, a livello di codice articolo, come descrizione in lingua, max per articolo e lingua caratteri 99*40 =3960 ti troveresti 99 NRRGM9 di lingua GB per un massimo di 40 caratteri cad.

    Concordo che questa costruzione sia alquanto scomoda (e probabilmente deriva dagli albori del DB dell'erp che alcune cose mantiene come "una volta")

    Presumo che per ovviare al problema, basterebbe creare una tabella lato RRP con CDARM9 chiave univoca, almeno 16 colonne DSARM9, DSARM9_1, DSARM9_2 etc etc da 255 caratteri. (In barba a cosa succede nelle stampe standard del fornitore, ordini clienti conferme d'ordine, preventivi che a quel punto le deve gestire in quanto una riga da 255 caratteri su un A4.....)

    Lato mio, stampo un'etichetta in base all'ordine cliente, riporto sia la descrizione di anagrafica, sia la descrizione in lingua.

    Fino ad ora gestivo la cosa utilizzando una condizione di where al campo numero riga dove NRRGM9=01. Ottenevo solo la prima riga in stampa sul report, che bene o male è il translate della riga secca di anagrafica articoli (36 caratteri vs 40)

    Ora, in teoria, se riesco a crearmi la tabella "normalizzata" posso fare una join uno a uno con le tre colonne di descrizione (che sono più che sufficienti al mio scopo)

    Spero di essermi spiegato.

    Ora al lavoro

  • Re: Problema Tabella

    Cia Fabio.... capito alla perfezione.

    Direi che può andare bene pensare di crearsi una tabella con i dati normalizzati e in orizzontale.... ma ci sarebbero anche altri metodi tramite join per reperire le descrizioni in lingua.

    Ma se per il flusso del tuo codice ritieni più semplice lavorare con tutti i dati in un record, allora va bene.

    13/05/2025 - Fabio76 ha scritto:

    Concordo che questa costruzione sia alquanto scomoda (e probabilmente deriva dagli albori del DB dell'erp che alcune cose mantiene come "una volta")

    ni ni ni ... Non tanto scomoda, con le dovute viste logiche estrai le informazioni in modo semplice e molto comodo.

    13/05/2025 - Fabio76 ha scritto:

    Ora, in teoria, se riesco a crearmi la tabella "normalizzata" posso fare una join uno a uno con le tre colonne di descrizione (che sono più che sufficienti al mio scopo)

    Bene... si si, raggiungi lo scopo agevolmente.

    .

    Mentre lato Utente, ... se vuoi ricreare da Zero la tabella di output, eliminare i records o andare in aggiunta ad un precedente import, nella demo trovi proprio tale metodi che puoi adottare. Se provi cosa fa la demo,  trovi proprio questo sistema.

    Attenzione se lavori in multiutenza, in tal caso si deve creare una tabella temporanea e ogni Utente lavora con le proprie informazioni.

    Buona continuazione, ciao.

    [EDIT]
    Vr aggiornata della demo https://www.transfernow.net/dl/20250514c0o5vUS9

  • Re: Problema Tabella

    Ottengo un messaggio di errore qui: dopo aver IMPORTATO la tabella DEN90_MGART09F e rinominata in TableInPut (per testare che fosse tutto ok).

    Run time 3061: ho il dubbio che nella select debba esplicitare tutti i campi di mgart09f.

  • Re: Problema Tabella

    Ciao,

    • Puoi anche collegarla la tabella invece di importarla... ma questo dipende dal tuo scenario specifico.
    • Non è necessario impostare tutti i campi della tabella, rallenta solo l'esecuzione della sql... in genere é importante elencare solo le colonne che occorrono 
    • Usa la costante invece di ridenominare la tabella "DEN90_MGART09F"

    Per esempio modifica il nome della costante tblInput in DEN90_MGART09F :

    ' Define input and ouput tables
    Private Const tblInput As String = "DEN90_MGART09F"
    

    :

    •  L'errore 3061 in genere  indica un problema di sintassi.... per esempio verifica se i nomi delle colonne nella tabella DEN90_MGART09F  corrispondono nella Sql String.
    • Puoi fare un screenshot della struttura della Tabella DEN90_MGART09F ? Oppure se vuoi, visto che hai importato la tabella DEN90_MGART09F, se non ci sono dati sensibili e se ha un numero di records contenuto (magari lasci solo pochi records), puoi postare il Database MsAccess e posso darci un occhiata. 
  • Re: Problema Tabella

    Franco, avevo già fatto così ovviamente, e,  non funzionando, ho provato a importare la tabella DEN90DAT_MGART09F è rinominarla in TableInPut e ancora mi da errore 3061.

    I campi li ho controllati e li hai scritti tutti in modo corretto (la struttura la vedi sopra, tabella as400).

    Fammi controllare ancora........nel frattempo (tabella collegata)

    EDIT: il campo errato era CDLGGM9 (quello corretto è CDLGM9)

    Habemus Tabulam, ora devo capire alcune cose, se automatizzare il tutto all'apertura della mia maschera, se aggiungere un filtro che mi scarti dei codici in base a una caratteristica dell'anagrafica articoli (se la creo così ogni mattina è troppo lenta) oppure accodare solo i record nuovi oppure scartare dove CDLGM9 = Vuoto quindi la lingua IT (che non mi serve)

    Nel frattempo ti ringrazio.

  • Re: Problema Tabella

    Ciao,

    1. devi controllare se i nomi delle colonne sono corretti. Quindi metti quelli giusti.
      1. alcuni Nomi delle colonne sono utilizzate nel codice, quindi fai ricerca e sostituisci con i nomi giusti tutte le fields interessate.
    2. la select della query la puoi modificare a tuo piacimento soprattutto nella parte Where Condition.
      1. se per eempio vuoi escludere tutti i records che non contengono la "Lingua"
        ' Open recordset from input table and read
        With DBEngine(0)(0).OpenRecordset("SELECT CDDTM9, CDLGGM9, CDARM9, NRRGM9, DSARM9 " & _
                                          "FROM " & tblInput & " " & _
                                          "WHERE CDLGGM9 IS NOT NULL AND Trim(CDLGGM9) <> '' " & _
                                          "ORDER BY CDDTM9, CDLGGM9, CDARM9, NRRGM9;" _
                                          , dbOpenSnapshot)
    

    :
    Fare attenzione a cosa contiene questa colonna. Se la lingua contiene una stringa vuota di lunghezza 0, oppure degli spazi, oppure Null, allora deve essere correttamente testata. 
    Verifica se il Test va a buon fine con :   WHERE CDLGGM9 IS NOT NULL AND Trim(CDLGGM9) <> ''

  • Re: Problema Tabella

    Da quello che si può vedere, nel post all'inizio di questa pagina, sembrerebbe che tu stia importando i dati da un file di testo.

    Se fosse così puoi postare il link al file tramite un sito di condivisione, tipo quello usato da By65Franco, in modo da poterlo sfruttare per realizzare un esempio coerente?

  • Re: Problema Tabella

    15/05/2025 - Stifone ha scritto:

    Da quello che si può vedere, nel post all'inizio di questa pagina, sembrerebbe che tu stia importando i dati da un file di testo.

    Se fosse così puoi postare il link al file tramite un sito di condivisione, tipo quello usato da By65Franco, in modo da poterlo sfruttare per realizzare un esempio coerente?

    Non ho capito Stifone, con quello postato da Franco sono riuscito a risolvere il problema di "normalizzare" la tabella. Ora devo solo provare a rendere più veloce l'operazione, scartando i regord dove la lingua è null oppure mettendo la tabella mgart09f in join con l'anagrafica articoli mgart00f.

    Vorrei mettere in join mgart09f con mgart00f (anagrafica articoli) dove cdarm9 = cdarma and tpstma (campo di mgart00f) =1

  • Re: Problema Tabella

    I dati che devi elaborare come li importi in Access?

    Comunque per chiarire ogni possibile dubbio non puoi postare un file di esempio, sotituendo eventuali dati sensibili?

  • Re: Problema Tabella

    Scusa Stifone, ma non ci sono dubbi da chiarire, i dati sono collegati a tabella as400 e l'esempio della tabella con dati non sensibili l'ha postata Franco in prima pagina,  chiamandola TableInput....

  • Re: Problema Tabella

    Chiedevo dei dati reali perchè direi che l'interpretazione 

    InPutIDCDDTM9CDLGGM9CDARM9NRRGM9DSARM9
    5401GBPippo1Description 1 Pippo
    5501GBPippo2Description 2 Pippo
    5601GBPippo3Description 3 Pippo
    5701GBPippo4Description 4 Pippo
    TableInPut

    data fino a ora è sbagliata eventualmente dovrebbe essere, come da immagine allegata nel primo post di questa pagina, la seguente

    InPutIDCDDTM9CDLGGM9CDARM9NRRGM9DSARM9
    5401 Articolo 11Descrizione Italiano
    5501GBArticolo 12Descrizione Inglese
    5601DEArticolo 13Descrizione Tedesco
    5701FRArticolo 14Descrizione Francese
    TableInPut
  • Re: Problema Tabella

    19/05/2025 - Stifone ha scritto:

    data fino a ora è sbagliata eventualmente dovrebbe essere, come da immagine allegata nel primo post di questa pagina, la seguente

    Ciao,

    se posso ... farei attenzione e leggerei più attentamente l'intero Thread ;-)  ... il primo esempio postato riporta che per lo stesso articolo si possono avere più descrizioni classificate/identificate per numero di riga.

    08/05/2025 - Fabio76 ha scritto:

    Ho una tabella collegata costruita in questo modo:

    E voler ottenere una tabella così:

    Quindi per quella Lingua per quell'Articolo possono esistere più descrizione ... pertanto gli esempi che successivamente sono stati discussi, sono corretti.

    Detto questo, possiamo affermare che la cosa più importante, fondamentale, è determinare con quale chiave lavorare.
    Stabilita la Key di lettura, eseguire una selezione e raggruppare delle descrizioni esposte in verticale da mettere in forma Orizzontale, è la cosa più semplice e banale che si possa fare.

    Adesso, per non tronare indietro inutilmente nella discussione che ha già chiarito aluni aspetti, Fabio deve solo impostare :

    • la sua Key di lettura e di Ordinamento dei records
    • impostare un filtro di selezione dei records, come per esempio non leggere i records dove la Lingua = "" oppre = Null

    :
    Pertanto lo stato attuale di questo Thread porta Fabio a prendere in considerazione una Sql String dove impostare i sui dati prendendo spunto da questo esempio:

     ' Open recordset from input table and read
        With DBEngine(0)(0).OpenRecordset("SELECT CDDTM9, CDLGGM9, CDARM9, NRRGM9, DSARM9 " & _
                                          "FROM " & tblInput & " " & _
                                          "WHERE CDLGGM9 IS NOT NULL AND Trim(CDLGGM9) <> '' " & _
                                          "ORDER BY CDDTM9, CDLGGM9, CDARM9, NRRGM9;" _
                                          , dbOpenSnapshot)

    Qui si deve :

    • impostare la propria SELECT
    • impostare la propria FROM table o  JOIN che si desidera
    • impostare nella WHERE le condizioni di filtro dei records (in questo caso vengono scartati tutti i records dove la Lingua risulta = "" oppure = Null)
    • impostare in ORDER BY con quale ordinamento devono essere letti i records (corrisponde alla key di lettura del recordset)

    :
    Tutto qua... quindi tornare indietro nella discussione mi sembra solo una perdita di tempo nel momento in cui Fabio ha già certificato l'attuale stato dell'arte.

  • Re: Problema Tabella

    Ciao Franco, sto provando a mettere in join le due tabelle, lingua e anagrafica articoli, per applicare condizioni di where su campi dell'anagrafica articoli che mi permette di 

    Partendo dal tuo esempio: 

    ' Define input and ouput tables
    Private Const tblInput As String = "DEN90DAT_MGART09F"
    Private Const tblAnagrafica As String = "DEN90DAT_MGART00F"
    Private Const tblOutput As String = "TableOutput"
    Private Const rowsMax As Integer = 3

    ma in questo punto non capisco quello evidenziato in giallo

     With DBEngine(0)(0).OpenRecordset("SELECT CDDTM9, CDLGM9, CDARM9, NRRGM9, DSARM9 FROM " & tblInput & _
       " ORDER BY CDDTM9, CDLGM9, CDARM9, NRRGM9;", dbOpenSnapshot)

    Mi verrebbe da dire che si trasforma in select (miei campi) from (&=concatena tblInput quindi  from MGART09F) & _

    Io quindi sto provando:

      With DBEngine(0)(0).OpenRecordset("SELECT CDDTM9, CDLGM9, CDARM9, NRRGM9, DSARM9 FROM " & tblInput  INNER JOIN FROM " & tblAnagrafica ON CDARM9 = CDARMA  where tpstma= "1" & _
        " ORDER BY CDDTM9, CDLGM9, CDARM9, NRRGM9;", dbOpenSnapshot)

    In tutte le prove che sto eseguendo (a tentativi) sbaglio ovviamente la sintassi non conoscendo minimamente il vba

  • Re: Problema Tabella

    Ciao Fabio

    è una concatenazione di stringhe dove vai ad inserire delle variabili definite da codice.
    Andiamo Passo Passo a scrivere....

    La tua prima stringa sql da concatenare è :

    "SELECT CDDTM9, CDLGM9, CDARM9, NRRGM9, DSARM9 FROM "

    Adesso devi concatenare la variabile : (questa è una variabile stringa che contiene il nome della tabella di input)

    "SELECT CDDTM9, CDLGM9, CDARM9, NRRGM9, DSARM9 FROM " & tblInput  

    Adesso devi concatenare la seconda parte della stringa sql :

    "SELECT CDDTM9, CDLGM9, CDARM9, NRRGM9, DSARM9 FROM " & tblInput & " INNER JOIN FROM "

    Adesso devi concatenare la variabile : (questa è una variabile stringa che contiene il nome della tabella anagrafica)

    "SELECT CDDTM9, CDLGM9, CDARM9, NRRGM9, DSARM9 FROM " & tblInput & " INNER JOIN FROM " & tblAnagrafica 

    Adesso devi concatenare la terza parte della stringa sql :

    "SELECT CDDTM9, CDLGM9, CDARM9, NRRGM9, DSARM9 FROM " & tblInput & " INNER JOIN FROM " & tblAnagrafica & _
    	" ON CDARM9 = CDARMA WHERE tpstma = 1" & _
        " ORDER BY CDDTM9, CDLGM9, CDARM9, NRRGM9;"

    :

    • Fai attenzione ad alcune cose :
      • Quando è necessario inserire uno spazio all'interno delle stringhe prima o dopo le concatenazioni ? ... Esempio: 
      • 	....FROM " & tblInput & " INNER....
        • come puoi notare, dopo la FORM e prima della INNER,viene inserito uno spazio che concatena in modo corretto il contenuto della variabile
      • Quando trovi il simbolo di concatena con il trattino basso  '& _'  :
        • questo serve semplicemente per andare a capo e rendere il codice più leggibile.
    • Fare attenzione nella WHERE condition :
      • WHERE tpstma = 1
        • se tpstma  è di tipo numerico va bene scrivere :  tpstma = 1
        • se tpstma  è di tipoo stringa allora lo devi racchiudere tra apicini :  tpstma = '1'
        • Esempio:
        • " ON CDARM9 = CDARMA  WHERE tpstma = 1" & _
          oppure
          " ON CDARM9 = CDARMA  WHERE tpstma = '1'" & _

    :

    Ovviamente non ti stò validando l'intera stringa sql ... ma indicando solo gli errori di sintassi di come concatenare le stringhe con delle variabili.  Ok ?

    Se la tua SELECT è corretta, io la scriverei in questo modo per renderla più comprensibile ... Esempio:

    "SELECT CDDTM9, CDLGM9, CDARM9, NRRGM9, DSARM9 FROM " & tblInput & _
    	" INNER JOIN FROM " & tblAnagrafica & " ON CDARM9 = CDARMA" & _
    	" WHERE tpstma = 1" & _
        " ORDER BY CDDTM9, CDLGM9, CDARM9, NRRGM9;"
  • Re: Problema Tabella

    Può tornare molto utile usare il Debug per controllare come hai concatenato la tua stringa sql

    Per esempio imposta un punto di interruzione sulla riga di codice :
    With DBEngine(0)(0).OpenRecordset("SELECT CDDTM9, CDLGM9, CDARM9, NRRGM

    - apri la finestra immediata ( CTRL+G ) nell'editor vba e inserisci la tua stringa preceduta dal punto interrogativo '?'

    - adesso premi invio e potrai vedere come hai concatenato le stringhe e le variabili

    Puoi valutare se hai scritto correttamente la tua stringa sql, se hai lasciato gli spazi dove è necessario e vedrai il valore contenuto nelle variabili. 

    :

    Per esempio nel mio codice di "esempio" avrò come risultato (vedere immagine allegata)...  
    dove è possibile verificare se la spaziatura è corretta e il valore della variabile che contiene il nome della tabella...

Devi accedere o registrarti per scrivere nel forum
45 risposte