ProsoSQL
13-07-2010, 18:23
Carissimi amici di hwupgrade, la premessa di essere un principiante in programmazione farà scappare molti e forse dopo aver letto quello che ho cercato di fare magari mi bannerete a vita. Senza alcuna conoscenza in programmazione mi sono barcamenato nella creazione di un database gestibile tramite l'applicativo a pagamento "Appmaker". Ho iniziato a fare progressi nella gestione dei miei dati sinchè erano semplici tabelle e campi non legati, ma quando ho iniziato a creare delle query allora sono iniziati i miei problemi.
Vengo al punto per il quale chiedo l'aiuto di voi esperti.
Il mio database costruito in Access contiene tre tabelle: 1) FoglioProduzione, 2) MasterTableEccipienti, 3)SubTableEccipienti. Per comodità mi riferirò alle singole tabelle con i numeri tra parentesi (1), (2), (3). (1) contiene: Key1 (chiave primaria-contatore), Numero (numerico), Prodotto (Testo). (2) contiene: Key2 (chiave primaria-contatore), AlphaID (Testo), Eccipiente (Testo), Value1 (numerico), Seleziona (Si/No). (3) contiene: Key1 e Key2 (chiavi primarie-numerico), check (Si/No), Value2 (Testo), Data2 (Testo).
Allora quello che voglio fare è avere un elenco di materie prime nella tabella (2) elencate nel campo "Eccipiente", indicare la quantità in magazzino e poi tramite la tabella (1) creare dei prodotti che utilizzano le materie prime e che automaticamente mi forniscono la quantità residua.
Ecco come ho fatto utilizzando delle stringhe sql nel programma in questione:
SELECT
Key2, Eccipiente, Ucase(Left(Eccipiente, 5)) AS VisibleCounter, Value1 AS TotalQuantity
FROM
MasterTableEccipienti
---in questo modo identifico le materie prime e la quantità totale---
Define Recordset rsMaster
Define Recordset rsSub
rsMaster.OpenReadOnly "SELECT * FROM MasterTableEccipienti"
rsSub.Open "SELECT * FROM SubTableEccipienti WHERE Key1={{Key1}}"
While rsMaster.EOF <> True Do
If rsSub.RecordCount > 0 Then
rsSub.MoveFirst
EndIf
rsSub.Find " Key2=" + rsMaster!Key2
If rsSub.EOF = True Then
rsSub.AddNew
rsSub!Key1 = {{Key1}}
rsSub!Key2 = rsMaster!Key2
rsSub.Update
EndIf
rsMaster.MoveNext
Done
rsMaster.Close
rsSub.Close
Return
--con questo comando linko key1 e key2 per i calcoli (mi sono fatto aiutare da un amico)--
SELECT Key1, Key2, Check1, Value2 AS QuantityUsed, Data2, '[[Key2]]' As QuantityRemaining FROM SubTableEccipienti WHERE Key1={Key1}
--in questo modo mi vado a leggere la quantità rimasta---
SELECT
MasterTableEccipienti.Eccipiente,
MasterTableEccipienti.Value1 AS TotalQuantity,
SUM(SubTableEccipienti.Value2) AS QuantityUsed,
TotalQuantity - QuantityUsed AS QuantityRemaining
FROM
MasterTableEccipienti
LEFT OUTER JOIN SubTableEccipienti ON SubTableEccipienti.Data2 =
MasterTableEccipienti.Eccipiente
GROUP BY
MasterTableEccipienti.Eccipiente,
MasterTableEccipienti.Value1
---così faccio i calcoli---
Ora il problema è arrivato quando le materie prime sono uguali ma appartengono, ad esempio, a lotti diversi. Nei calcoli non riesco a separare i diversi lotti o le diverse tipologie di materie prime. Allora ho cercato di inserire nel campo "Eccipiente" un nome univoco (tipo Mela - rossa e non solamente Mela) per poi separarlo con questa stringa sql:
Trim(Left(Eccipiente, InStr(1, Eccipiente, ' - '))) as Part1,
Trim(Right(Eccipiente, Len(Eccipiente) - InStr(1, Eccipiente, ' - ') - 1)) as Part2
Funziona, solamente che quando il nome non contiene il carattere ' - ' non riesco a separare i due campi. Ho pensato di usare CASE all'interno di SELECT in modo da dire: se c'è ' - ' allora segui Trim, ELSE leggi l'intero campo.
Non riesco a far funzionare CASE all'interno di SELECT. Ho fatto una prova del tipo:
SELECT Key2, CASE Eccipiente WHEN 'Ap' THEN Apple WHEN 'Or' THEN Orange ELSE 'Some Other Fruit' END AS 'New Value' FROM MasterTableEccipienti
Non funziona.
Mi rendo conto che non sono stato chiarissimo, tuttavia chiedo l'aiuto di un esperto di buona volontà. Magari mandando il mio file mdb ed utilizzando la versione shareware di Appmaker, qualche anima pia mi può dare una mano.
Grazie a tutti,
Paolo
Vengo al punto per il quale chiedo l'aiuto di voi esperti.
Il mio database costruito in Access contiene tre tabelle: 1) FoglioProduzione, 2) MasterTableEccipienti, 3)SubTableEccipienti. Per comodità mi riferirò alle singole tabelle con i numeri tra parentesi (1), (2), (3). (1) contiene: Key1 (chiave primaria-contatore), Numero (numerico), Prodotto (Testo). (2) contiene: Key2 (chiave primaria-contatore), AlphaID (Testo), Eccipiente (Testo), Value1 (numerico), Seleziona (Si/No). (3) contiene: Key1 e Key2 (chiavi primarie-numerico), check (Si/No), Value2 (Testo), Data2 (Testo).
Allora quello che voglio fare è avere un elenco di materie prime nella tabella (2) elencate nel campo "Eccipiente", indicare la quantità in magazzino e poi tramite la tabella (1) creare dei prodotti che utilizzano le materie prime e che automaticamente mi forniscono la quantità residua.
Ecco come ho fatto utilizzando delle stringhe sql nel programma in questione:
SELECT
Key2, Eccipiente, Ucase(Left(Eccipiente, 5)) AS VisibleCounter, Value1 AS TotalQuantity
FROM
MasterTableEccipienti
---in questo modo identifico le materie prime e la quantità totale---
Define Recordset rsMaster
Define Recordset rsSub
rsMaster.OpenReadOnly "SELECT * FROM MasterTableEccipienti"
rsSub.Open "SELECT * FROM SubTableEccipienti WHERE Key1={{Key1}}"
While rsMaster.EOF <> True Do
If rsSub.RecordCount > 0 Then
rsSub.MoveFirst
EndIf
rsSub.Find " Key2=" + rsMaster!Key2
If rsSub.EOF = True Then
rsSub.AddNew
rsSub!Key1 = {{Key1}}
rsSub!Key2 = rsMaster!Key2
rsSub.Update
EndIf
rsMaster.MoveNext
Done
rsMaster.Close
rsSub.Close
Return
--con questo comando linko key1 e key2 per i calcoli (mi sono fatto aiutare da un amico)--
SELECT Key1, Key2, Check1, Value2 AS QuantityUsed, Data2, '[[Key2]]' As QuantityRemaining FROM SubTableEccipienti WHERE Key1={Key1}
--in questo modo mi vado a leggere la quantità rimasta---
SELECT
MasterTableEccipienti.Eccipiente,
MasterTableEccipienti.Value1 AS TotalQuantity,
SUM(SubTableEccipienti.Value2) AS QuantityUsed,
TotalQuantity - QuantityUsed AS QuantityRemaining
FROM
MasterTableEccipienti
LEFT OUTER JOIN SubTableEccipienti ON SubTableEccipienti.Data2 =
MasterTableEccipienti.Eccipiente
GROUP BY
MasterTableEccipienti.Eccipiente,
MasterTableEccipienti.Value1
---così faccio i calcoli---
Ora il problema è arrivato quando le materie prime sono uguali ma appartengono, ad esempio, a lotti diversi. Nei calcoli non riesco a separare i diversi lotti o le diverse tipologie di materie prime. Allora ho cercato di inserire nel campo "Eccipiente" un nome univoco (tipo Mela - rossa e non solamente Mela) per poi separarlo con questa stringa sql:
Trim(Left(Eccipiente, InStr(1, Eccipiente, ' - '))) as Part1,
Trim(Right(Eccipiente, Len(Eccipiente) - InStr(1, Eccipiente, ' - ') - 1)) as Part2
Funziona, solamente che quando il nome non contiene il carattere ' - ' non riesco a separare i due campi. Ho pensato di usare CASE all'interno di SELECT in modo da dire: se c'è ' - ' allora segui Trim, ELSE leggi l'intero campo.
Non riesco a far funzionare CASE all'interno di SELECT. Ho fatto una prova del tipo:
SELECT Key2, CASE Eccipiente WHEN 'Ap' THEN Apple WHEN 'Or' THEN Orange ELSE 'Some Other Fruit' END AS 'New Value' FROM MasterTableEccipienti
Non funziona.
Mi rendo conto che non sono stato chiarissimo, tuttavia chiedo l'aiuto di un esperto di buona volontà. Magari mandando il mio file mdb ed utilizzando la versione shareware di Appmaker, qualche anima pia mi può dare una mano.
Grazie a tutti,
Paolo