[risolto] Azioni su più tabelle contenute in un database

GigiBena

Nuovo Utente
7 Apr 2013
12
0
1
Ho un database aggiornamenti.mdb che contiene due tabelle
Tabella PRODOTTI con campi prodotto e consumato
Tabella STATISTICA con campi prodotto e totalestatistica

Sarebbe mia intenzione creare una funzione che:
parta dal primo record della tabella prodotti, legga il dato del campo prodotto (es 34723), lo confronti con TUTTI i campi prodotto della tabella statistica e se il dato risulta uguale, scriva nel campo consumato sempre del primo record della tabella prodotti il valore contenuto nel campo totalestatistica. Successivamente passi al secondo record ripeta il controllo su tutti i record e se presente scriva, ecc.

Non essendo un esperto, in modo molto approssimativo avrei pensato a questa soluzione. E' corretto aprire in questo modo la connessione al database e i Recordset?
<%
Set Conn=Server.CreateObject("ADODB.Connection")
strConn="driver={Microsoft Access Driver (*.mdb)}; "
strConn=strConn & " DBQ=" & Server.MapPath("aggiornamenti.mdb")
strConn=strConn & ";pwd=" & strCode
Conn.Open strConn
sql = "SELECT * FROM PRODOTTI "
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open sql, conn ,3,3
Dim Nrecord ‘ CONTO IL NUMERO DI RECORD TOTALI
Nrecord=rs.RecordCount
Set Conn2=Server.CreateObject("ADODB.Connection")
strConn="driver={Microsoft Access Driver (*.mdb)}; "
strConn=strConn & " DBQ=" & Server.MapPath("aggiornamenti.mdb")
strConn=strConn & ";pwd=" & strCode
Conn2.Open strConn
For contatore = 1 To Nrecord
prodotto=rs(1)
sql2="SELECT * FROM statistica"
sql2=sql2 & " WHERE prodotto='" & prodotto & "' ORDER BY id DESC"
Set rs2 = Server.CreateObject("ADODB.Recordset")
rs2.Open sql2, Conn2 ,3,3
if not(rs2.eof) then
do while not(rs2.eof)
dim totstatistica
totstatistica =rs2(2)
rs(2)= totstatistica
rs.update
rs2.movenext
loop
rs.movenext
next
Chiusura connessione
%>

Grazie mille
Gigi
 
...mandami una copia del DB a: (rimossa)
ovviamente con un numero congruo di record in modo da simulare le tue esigenze, a tempo perso ti creo lo script.
Paolo
 
Ultima modifica:
Ciao, per non creare dei dati ridondanti ho elaborato per te questo script che effettua una join sulle due tabelle:

Codice:
<%

' @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
' @@@@ CONNESSIONE AL DATA BASE
' @@@@ Versione ACCESS
	strConnect = "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.mappath("/fitness/script/aggiornamenti.mdb")
' @@@@ DB in sola lettura non presente in tutti i Comandi
' @@@@ Fine
' @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
' ^^^^^^^ INIZIO 
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

	Set Ciclo = Server.CreateObject("ADODB.Recordset")
		Ciclo.ActiveConnection = strConnect
		Ciclo.Source = "SELECT * FROM prodotti " &_ 
				    "INNER JOIN statistica ON prodotti.prodotto=statistica.prodotto WHERE prodotti.prodotto=statistica.prodotto " &_ 
				    "ORDER BY prodotti.nomeprodotto;" 
		Ciclo.CursorType = 0
		Ciclo.CursorLocation = 2
		Ciclo.LockType = 1
		Ciclo.Open()
			If NOT Ciclo.EOF Then ' se presente visualizzo

%>
<table width="600" cellpadding="1" cellspacing="1" border="1" align="center">
<tr>
<td width="120">codice</td>
<td>prodotto</td>
<td>statistica</td>
</tr>
<%
					Ciclo_Min = 0
					Ciclo_Max = 999 ' massimo record estrapolati
				While ((Ciclo_Min <> Ciclo_Max) AND (NOT Ciclo.EOF))
				
						prodotto = (Ciclo.Fields.Item("prodotto").Value)
						nome_prodotto = (Ciclo.Fields.Item("Nomeprodotto").Value)
						statistica = (Ciclo.Fields.Item("totalestatistica").Value)
						
						
%>
<tr>
<td><%=prodotto%></td>
<td><%=nome_prodotto%></td>
<td><%=statistica%></td>
</tr>
<%
		
					Ciclo_Min = Ciclo_Min + 1
					Ciclo.MoveNext()
				Wend

%>
</table>
<%
			End If ' chiudo controllo record
		Ciclo.Close
	Set Ciclo = Nothing ' chiudo il recordset

' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
' ^^^^^^^ FINE 
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

%>


Link prova: http://www.caprioli.info/fitness/script/aggiornamenti.asp

Se hai bisogno di ulteriori modifiche e non sei in grado chiedi pure.
Buona serata.
Paolo
 
Fantastico, funziona perfettamente. Ma come dovrei comportarmi se volessi scrivere fisicamente,”quando il confronto corrisponde”, il contenuto del campo totalestatistica della tabella statistica, nel campo consumato della tabella prodotti,?
Grazie ancora
Gigi
 
Allora, aggiungi questo nella pagina aggiornamenti:

Codice:
.....
		Ciclo.Open()
			If NOT Ciclo.EOF Then ' se presente visualizzo

%>
[B][COLOR="#FF0000"]<p><a href="aggiornamenti_SYS.asp">Parifica le tabelle</a></p>[/COLOR][/B]
<table width="600" cellpadding="1" cellspacing="1" border="1" align="center">
<tr>
<td width="120">codice</td>

Crea un nuovo file e lo chiami "aggiornamenti_SYS.asp" che si occuoperà di parificare le informazioni:

Codice:
<%

' @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
' @@@@ CONNESSIONE AL DATA BASE
' @@@@ Versione ACCESS

'	strPath = "C:\inetpub\my-site\caprioli.info\fitness\script\aggiornamenti.mdb"
'	strConnect = "DRIVER={Microsoft Access Driver (*.mdb)};" & "DBQ=" & strPath

	strConnect = "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.mappath("/mdb-database/aggiornamenti.mdb")
' @@@@ DB in sola lettura non presente in tutti i Comandi
' @@@@ Fine
' @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
' ^^^^^^^ INIZIO - FORM SELECT
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

	Set Ciclo = Server.CreateObject("ADODB.Recordset")
		Ciclo.ActiveConnection = strConnect
		Ciclo.Source = "SELECT * FROM prodotti " &_ 
						 "INNER JOIN statistica ON prodotti.prodotto=statistica.prodotto WHERE prodotti.prodotto=statistica.prodotto " &_ 
						 "ORDER BY prodotti.nomeprodotto;" 
		Ciclo.CursorType = 0
		Ciclo.CursorLocation = 2
		Ciclo.LockType = 1
		Ciclo.Open()
			If NOT Ciclo.EOF Then ' se presente visualizzo

					Ciclo_Min = 0
					Ciclo_Max = 999 ' massimo record estrapolati
				While ((Ciclo_Min <> Ciclo_Max) AND (NOT Ciclo.EOF))
				
						prodotto = (Ciclo.Fields.Item("prodotto").Value)
						nome_prodotto = (Ciclo.Fields.Item("Nomeprodotto").Value)
						statistica = (Ciclo.Fields.Item("totalestatistica").Value)
						
						
' @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
' EFFETTUO AGGIORNAMENTO DB PARIFICANDO LE DUE TABELLE
						Set Rs = server.CreateObject ("ADODB.Connection")
							Rs.Open (strConnect)
							QuerySQL =  "UPDATE prodotti SET " &_
										"consumato = '"&statistica&"' " &_
										"WHERE " &_
										"prodotto = '"&prodotto&"'"
							Rs.Execute QuerySQL
						Set Rs = Nothing
' FINE AGGIORNAMENTO
' @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
		
					Ciclo_Min = Ciclo_Min + 1
					Ciclo.MoveNext()
				Wend
%>
	<script language="javascript">
			alert("Informazioni aggiornate con successo!")
		location.replace("aggiornamenti.asp");
    </script>
<%

			End If ' chiudo controllo record
		Ciclo.Close
	Set Ciclo = Nothing ' chiudo il recordset

' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
' ^^^^^^^ FINE - FORM SELECT
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

%>

Link esempio: http://www.caprioli.info/fitness/script/aggiornamenti.asp

Buona serata.
 
Azioni su più tabelle contenute in un database

Buonasera
Sono ancora a disturbarti chiedendoti se è possibile eseguire la stessa procedura su DUE database distinti anziché sullo stesso database. La funzione deve COPIARE quando il confronto corrisponde”, il contenuto del campo totalestatistica della tabella statistica (database statistica.mdb), nel campo consumato della tabella prodotti. (database aggiornamenti.mdb),
Grazie anticipatamente
Gigi
 
Buongiorno, ecco il codice che soddisfa le tue esigenze:

Codice:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%

' @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
' @@@@ CONNESSIONE AL DATA BASE aggiornamento.mdb
	strConnect1 = "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.mappath("aggiornamenti.mdb")
' @@@@ CONNESSIONE AL DATA BASE statistica.mdb
	strConnect2 = "driver={Microsoft Access Driver (*.mdb)};dbq=" & server.mappath("statistica.mdb")
' @@@@ Fine
' @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
' ^^^^^^^ INIZIO - FORM SELECT
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

	Set Ciclo = Server.CreateObject("ADODB.Recordset")
		Ciclo.ActiveConnection = strConnect2
		Ciclo.Source = "SELECT * FROM statistica" 
		Ciclo.CursorType = 0
		Ciclo.CursorLocation = 2
		Ciclo.LockType = 1
		Ciclo.Open()
			If NOT Ciclo.EOF Then ' se presente visualizzo

					Ciclo_Min = 0
					Ciclo_Max = 999 ' massimo record estrapolati
				While ((Ciclo_Min <> Ciclo_Max) AND (NOT Ciclo.EOF))
				
						prodotto = (Ciclo.Fields.Item("prodotto").Value)
						totalestatistica = (Ciclo.Fields.Item("totalestatistica").Value)
						
						
' @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

				Set objRs = Server.CreateObject("ADODB.Recordset")
					strSQL = "SELECT * FROM prodotti WHERE prodotto = '"&prodotto&"' ;"
					objRs.Open strSQL, strConnect1
							If NOT objRs.EOF Then 
				
									id_prodotto = (objRs.Fields.Item("id").Value)
									
					' EFFETTUO AGGIORNAMENTO DB PARIFICANDO LE DUE TABELLE
										Set Rs = server.CreateObject ("ADODB.Connection")
											Rs.Open (strConnect1)
											QuerySQL =  "UPDATE prodotti SET " &_
														"consumato = '"&totalestatistica&"' " &_
														"WHERE " &_
														"id = "&id_prodotto
											Rs.Execute QuerySQL
										Set Rs = Nothing
					' FINE AGGIORNAMENTO
				
							End If
					objRs.Close
				Set objRs = Nothing

' @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
		
					Ciclo_Min = Ciclo_Min + 1
					Ciclo.MoveNext()
				Wend
%>
	<script language="javascript">
			alert("Informazioni aggiornate con successo!")
    </script>
<%

			End If ' chiudo controllo record
		Ciclo.Close
	Set Ciclo = Nothing ' chiudo il recordset

' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
' ^^^^^^^ FINE - FORM SELECT
' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

%>

Paolo
 

Discussioni simili