[ASP] scaricare articoli

djjunior

Utente Attivo
24 Lug 2004
86
1
8
Ciao a tutti,
devo creare un sistema che scarica gli articoli da uguale prodotto in pratica:
Ho un form dove ho 2 campi
NOME ARTICOLO e QUANTITA' DA SCARICARE.
Nel db ho gli articoli con nome, quantità massima da consumare e quantita consumata.
Esempio: ho 2(o piu) Prodotti con id diverso ma con lo stesso nome : BORSE e possono avere quantità diverse tipo:
id: 1 - BORSE - qta 300 - qtaconsumata:0
id: 3 - BORSE - qta 100 - qtaconsumata:0
id: 6 - BORSE - qta 230 - qtaconsumata:0
ora dovrei scaricare la quantità....Se nel form faccio un richiesta tipo:
NOME ARTICOLO: BORSE
QUANTITA DA SCARICARE: 650
Se la QUANTITA' DA SCARICARE è maggiore cioè 650 deve elaborarmi:
id: 1 - BORSE - qta 300 - qtaconsumata:300
id: 3 - BORSE - qta 100 - qtaconsumata:100
id: 6 - BORSE - qta 230 - qtaconsumata:230
o
NOME ARTICOLO: BORSE
QUANTITA DA SCARICARE: 420
Se la QUANTITA' DA SCARICARE è minore cioè 420 deve elaborarmi:
id: 1 - BORSE - qta 300 - qtaconsumata:300
id: 3 - BORSE - qta 100 - qtaconsumata:100
id: 6 - BORSE - qta 230 - qtaconsumata:20
o
NOME ARTICOLO: BORSE
QUANTITA DA SCARICARE: 250
Se la QUANTITA' DA SCARICARE è ancora minore cioè 250 deve elaborarmi:
id: 1 - BORSE - qta 300 - qtaconsumata:250 (eliminare dal record con qta più alta)
id: 3 - BORSE - qta 100 - qtaconsumata:0
id: 6 - BORSE - qta 230 - qtaconsumata:0

Il tutto deve essere salvato su db
Grazie a può aiutarmi
 
Ultima modifica:

vic53

Nuovo Utente
9 Feb 2019
35
0
6
Fonte Nuova
www.euro1.it
Per fare quello che chiedi, devi creare un piccolo sottoprogramma
1. impostare un array bidimensionale
2. caricare l'array con id e qta per ognun id
3. usare un ciclo do until fino a che la qtarichiesta = qtaprelevata
e scaricare qta l'elemento inlinea nel ciclo
4. all'uscita dal ciclo ci possono avere piu condizioni
a) la qta è stata trovata tutta e in tal caso aggiornare i record che sono stati scaricati fino all'elemento che ha uguale la qtaprelevata con la qtarichiestam in uscita la qta è stata presa tutta

b) la qta non è stata trovata tutta, in qual caso aggiornare tutto a zero perche li hai presi tutti ma ti mancano ancora articoli
in uscita la qta è stata prelevata parzialmente
ora bisogna
... scrivere la sub.....
ciao
 

vic53

Nuovo Utente
9 Feb 2019
35
0
6
Fonte Nuova
www.euro1.it
ti ho scritto un piccolo programma per fare quello che mi hai chiesto dato che avevo qualche minuto libero ... dagli una occhiata, la tabella access è in descrizione nel codice... e presumo la debba costruire uguale alla mia versione o adattarla
io ci ho messo qualche record per prova ma tu ci devi mettere lo stesso un po di record se la crei
il programma usa la tecnica di richiamare se stesso per elaborare i dati... il db sta nella cartella DB e si chiama database.accdb
presumo che tu lo crei è un access 2007 o successivo
Codice:
<%
Public SQL,RS,conn,DB
DB="DB/DATABASE.Accdb"
Set conn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.Recordset")
CurrentProject ="Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" &Server.MapPath(DB) & ";Persist Security Info=False;"
conn.Open CurrentProject
'
'connessione al DB ACCESS effettuata
'
Dim Descrizione,idarticolo,prezzo,qtapresente,qtaprelevata,SW
Dim ThisProgram,formname
ThisProgram="ScaricaArticoli.asp"
formname=left(ThisProgram, len(ThisProgram) - 4)
descrizione="borse"
SW=""
for i=1 to Request.form("SW").Count
  SW= Request.form("SW")(i)
next
for i=1 to Request.QueryString("descrizione").Count
  descrizione=Request.QueryString("descrizione")(i)
next
for i=1 to Request.QueryString("qta").Count
  qta=Request.QueryString("qta")(i)
next
for i=1 to Request.QueryString("idarticolo").Count
  idarticolo=Request.QueryString("idarticolo")(i)
next

if SW="SCARICO" then
 Scarica descrizione, qta
end if
if SW="SCARICO" then
 Ricarica idarticolo, qta
end if

%>
<html>
<head>
<title>Scarico articoli</title>
<script type="text/javascript" language="javascript">
function Seleziona(pagina) {
 document.<%=formname%>.action = pagina;
 document.<%=formname%>.submit();
 return true;
}
function PrelevaArticolo() {
var descrizione;
 descrizione=prompt("descrizione articolo da scaricare","");
 if (descrizione){
  var qta=prompt("quanti pezzi ?",0);
  Scarica(qta,descrizione)
  }
}
function CaricaArticolo(){
 var idArticolo;
 document.getElementById("SW").value="CARICO";
 idArticolo=prompt("idArticolo da ricaricare","");
 if (idArticolo) {
  var qta=prompt("quanti pezzi ?",0);
  Ricarica(qta,idArticolo);
  }
}
function Scarica(Q,D){
  alert("vuoi scaricare n."+Q+" "+D);
  document.getElementById("SW").value="SCARICO";
  Seleziona("ScaricaArticoli.asp?descrizione="+D+"&qta="+Q);
}
function Ricarica(Q,I){
  alert("vuoi caricare n."+Q+" pezzi all'articolo id="+I);
  document.getElementById("SW").value="CARICO";
  Seleziona("ScaricaArticoli?idarticoloe="+I+"&qta="+Q);

}
function RicercaArticolo(des){
Seleziona("ScaricaArticoli.asp?descrizione="+des);
}
</script>

<style type="text/css">
div.box
{
    width:99.6% !important;  width /**/:99.6%;
    height:450px !important; height /**/: 450px;
    padding: 4px;
    border:1px solid #EEE; border-right:0 solid;
    overflow:auto;
   background-color:#CCCCCC;
}
.txt1 {
 color:blue;
 font-family:Verdana, Geneva, Tahoma, sans-serif;
 font-size: 14px;
}
.auto-style1 {
   color: #008000;
   text-align: center;
}
.auto-style2 {
   font-family: Verdana, Geneva, Tahoma, sans-serif;
   font-size: xx-small;
}
</style>

</head>

<body>
<form name="<%=formname%>" id="<%=formname%>" action="" method="post"  >
<input type="hidden" id="SW" name="SW" value="" />
<%
'
' struttura tabella Articoli
'
' idArticolo    numerico long int
' descrizione   text  255 char
' qtaPresent    numerico long int
' qtaPrelevata  numerico long int
' prezzo        numerico double 2 decimali
'
'
if descrizione="*" then
 SQL="select * from Articoli where qtapresente>0"
else
SQL="select * from Articoli where  descrizione='"& descrizione & "' and qtaPresente > 0 order by idArticolo ASC"
end if
RS.Open SQL, conn, 3, 3
%>
<p align="center"><h2 class="auto-style1">Programma di test - scarico articoli dal magazzino</h2></p>
<h3 class="txt1">RICERCA ARTICOLI:
<input type="text" class="txt1" id="descrizione" name="descrizione" value="<%=descrizione%>" maxlength="50" size="50" /> <input type="button" value=" ricerca " class="txt1" onclick="RicercaArticolo(descrizione.value)" /></h3>
&nbsp;
<table width="99.6%" border="0" cellspacing="2" cellpadding="3">
  <tr bgcolor="#ff9999" class="txt1">
                 <th width="15%" align="center">ID.ARTICOLO</th>
                 <th width="40%">DESCRIZIONE</th>
                 <th width="15%">Q.TA'PRESENTE</th>
                 <th width="15%">Q.TA'PRELEVATA</th>
                 <th width="15%">PREZZO UNI.</th>
    </tr>
</table>
<div class="box">
<table width="99.6%" border="0" cellspacing="2" cellpadding="3">   
<%

if not RS.EOF then
   do until RS.EOF
     idArticolo=RS("idArticolo")
     StampaRiga(RS)
     RS.Movenext
   loop
end if  
RS.Close
%>
</table>
</div>
<p>
<input type="button" value="RICARICO" onclick="CaricaArticolo()" class="auto-style2" ><span class="auto-style2">&nbsp;&nbsp;
</span>
<input type="button" value="PRELIEVO" onclick="PrelevaArticolo()" class="auto-style2" ></p>
   <p class="auto-style2"> free software by vic53 2019</p>
</form>
</body>

</html>
<%
sub StampaRiga(RS)
prezzo=formatNumber(RS("prezzo"),2)
response.write("<tr bgcolor=""#ffff99""> ")
response.write("<td  align=""center"" width=""15%"">" & RS("idArticolo") & "</td>")
response.write("<td  width=""40%"">" & RS("descrizione") & "</td>")
response.write("<td  align=""center"" width=""15%"">" & RS("qtaPresente") & "</td>")
response.write("<td  align=""center"" width=""15%"">" & RS("qtaPrelevata") & "</td>")
response.write("<td  align=""right"" width=""15%"">" & prezzo & "</td>")
response.write("</tr> ")
end sub

sub  Scarica(descrizione, qta)
'limite al numero degli articoli nella matrice articoli "Mart" con descrizione uguale = 200
Dim Mart(200,2), ctr,qtascarico,idx
qtascarico=qta
SQL="select * from Articoli where descrizione = '"&descrizione&"' order by idarticolo ASC"
RS.Open SQL, conn, 3, 3
ctr=0
if not RS.EOf then
 do until RS.EOF
  ctr=ctr+1 'numero di articoli da cui scaricare
  Mart(ctr,0)=RS("idArticolo")
  Mart(ctr,1)=RS("qtaPresente") - RS("qtaPrelevata")
  Mart(ctr,2)=0
  RS.Movenext
 loop
end if
RS.Close
'la matrice contiene i record da scaricare le qta
' questo è l'agoritmo che fara' lo scarico

idx=0
do until qtascarico = 0
 idx=idx+1
 if (idx > ctr) then '** fine matrice caricata con le qta
  exit do
 end if
 if (Mart(idx,1) > qtascarico) then   ' qta - qtascarico è la qta rimanente da scaricare
  Mart(idx,2)=qtascarico 'registra la qta prelevata in Mart(idx,2)
  qtascarico=Mart(idx,2) - qtascarico 'diventa zero
  exit do
 else
  if (Mart(idx,1) = qtascarico) then
     Mart(idx,2)=qtascarico 'registra la qta prelevata in Mart(idx,2)
     qtascarico=Mart(idx,2) - qtascarico 'diventa zero
     Mart(idx,2)=Mart(idx,1)
     exit do
  else
     Mart(idx,2)=Mart(idx,1)
     qtascarico=qtascarico - Mart(idx,2)
  end if   
 end if  
loop
'ora stampa la matrice
W "matrice articoli - n.righe="&ctr
W " id articolo | qtapresente | qtaprelevata|"
for idx=1 to ctr
 W Mart(idx,0)&" | "&Mart(idx,1)&" | "&Mart(idx,2)
next

end sub

sub W(msg)
response.write "<br>"&msg
end sub

sub Ricarica(idarticolo, qta)

end sub

'chiusura connessione al DB
conn.Close
Set conn = nothing
Set RS = nothing

%>
 

vic53

Nuovo Utente
9 Feb 2019
35
0
6
Fonte Nuova
www.euro1.it
naturalmente il programma si chiama ScaricaArticoli.asp e il nome deve stare nella variabile ThisProgram in testa al codice dato che richiama se stesso... una altra cosa, volevo fare anche il ricarico per aggiornare le qta sugli articoli ma non l'ho terminato, poi lo riproseguirò se ti serve l'esempio.....
 
Ultima modifica:

djjunior

Utente Attivo
24 Lug 2004
86
1
8
grazie dello script Vic53 utilizzo mysql e ho fatto qualcosa nel frattempo anche io di più semplice ma adatto alla mia piattaforma, senza richiamo pagina etc.
Codice:
articolo = request.form("descrizione")
qta_da_scaricare = request.form("qta_da_scaricare")


sql="SELECT * FROM db WHERE Articolo ="
sql=sql & "'" & articolo & "' and (qta_articolo-qta_spuntata>0) "
Set rsa = Server.CreateObject("ADODB.Recordset")
rsa.Open sql, Conn, 3, 3

do while not rsa.eof

qtadoc = rsa.fields("qta_articolo")
qtaspu = rsa.fields("qta_spuntata")

qtarest = qtadoc-qtaspu

rsa.fields("qta_spuntata") = "" & qtarest & ""
rsa.update

qtaultima = qta_da_scaricare-qtarest

rsa.fields("qta_Spuntata") = "" & qtaultima & ""
rsa.update


rsa.MoveNext
loop
rsa.close
Ma ha un errore cui non riesco a risolvere:
Su 4 prodotti uguali mi fa:
al primo mi toglie la quantità giusta, al secondo la quantità restante, ma la quantità restante me la toglie anche agli altri 2 prodotti quindi 3 prodotti hanno la quantità restante, tipo:
Cerco prodottoa e imposto come quantità da scaricare 600, me ne trova 4:
1) PRODOTTOA : 538 ---> 538
2) PRODOTTOA : 538 ---_> 62
3) PRODOTTOA : 538 ----> 62
4) PRODOTTOA : 538 ----> 62
Naturalmente al punto 3 e punto 4 non doveva scaricare nulla, come posso ovviare?
Puoi aiutarmi su questo mio script scovando l'errore che commetto e dove?
Ti ringrazio
 

vic53

Nuovo Utente
9 Feb 2019
35
0
6
Fonte Nuova
www.euro1.it
perchè non usi la tecnica che ti ho indicato? carichi la matrice e poi esegui le sottrazioni sulla matrice aggiornando il database....
la subroutine che ti ho messo "Scarica(descrizione, qta)" se la modifichi risolvi iltuoo problema
Prima utilizzi un ciclo per caricare la matrice con gli oggetti con nome uguale poi se guardi la routine quella alla fine del ciclo scarica le qta correttamente...
tu non hai voluto provare a eseguire il programma che ti ho fatto altrimenti avivi gia risolto... puoi vreare un access alocale e guardare l'esecuzione...
al termine la matrice contiene i prodotti come idarticolo qtaoriginale e qta da prelevare...
quelli da non aggiornare sono a zero le qta prelevate e quindi non li tocchi.
al termine della routine basta scorrere la matrice caricata e aggiornare solo quelli che hanno qta prelevata > di zero e hai finito...
Se non riesci ti ritraduco la routine in Mysql dato che lo uso anche io,,,,
ciao

ps nel punto dove sta scritto
ora stampa la matrice... li puoi fare un ciclo per aggiornare il db ai record che hanno Mart(idx,2) > 0
che sarebbe la qta che togli a quel record (la somma di tutti i Mart(idx,2) > zero corrisponse alla qta prelevata) l'idArticolo sta nel Mart(idx,0)
***
 
Ultima modifica:

djjunior

Utente Attivo
24 Lug 2004
86
1
8
Grazie Vic53 per il tuo aiuto, l'aggiornamento dello scarico della quantità avviene tramite caricamento pagina mediante ajax dove aggiorna db mysql con le quantità , in pratica ho un elenco di tutti gli articoli ogni articolo ha un campo input QUANTITA' DA SCARICARE con funzione onchange e li imposto il nr da scaricare che come ti dicevo carica una pagina tramite ajax e mi aggiorna agli articoli di uguale nome la quantità da scaricare , vedi esempio allegato.
 

Allegati