webForumDet fria alternativet

inläsning/uppdatering från db till db

ASP

4 svar · 218 visningar · startad av tlee

Medlem sedan mars 2001290 inlägg
Frågan#1

Tjena..

Jag har 2 databaser..

Den ena databasen är en master och den andra en slave..

Informationen i slavedatabasen skall vara samma som det är i masterdatabasen.

Hur gör man enklast ett script som uppdaterar slavedatabasen med informationen i masterdatabasen..

Jag har gjort ett script som fungerar på följande vis.

Hämta alla data ur båda databaserna och sortera efter artikelnummer.
While Not Masterdatabas.EOF
Kolla ifall Masterdatabas("Artikelnummer") = Slavedatabas("Artikelnummer")
Om de är lika, kolla också att varugrupp, pris, artikelnamn är lika, är dom inte det så uppdatera, annars är den inte ändrad.
Är Artikelnumren olika så saknas antaligen artikeln i slavedatabasen så då lägger vi till den.
Hoppa fram ett steg i Masterdatabas och Slavedatabas
Wend

Jag har bifogat en liten del av koden så ni kan se hur jag har tänkt..

Koden fungerar bra om slavedatabasen och masterdatabasen har lika många poster, men om jag lägger
till en post i masterdatabasen så hänger sig scriptet i en oändlig loop eller nått, hur detta
kan ske fattar jag inte då jag stegar fram i databasen hela tiden..

Är det någon som ser någon lösning, ytterligare problem eller saker som kan förbättras?


Set DB_QUERY_TARGET = ConnectTarget.Execute("SELECT * FROM tbl_Products ORDER BY col_ArticleNr;")
Set DB_QUERY_SOURCE = ConnectSource.Execute("SELECT * FROM tbl_Products ORDER BY col_ArticleNr;")

	
intCounter = 0	
	
'-- Finns det något i källdatabasen.. 
While Not DB_QUERY_SOURCE.EOF

	'-- Öka räknaren med 1
	intCounter = intCounter + 1

	'-- Om det inte finns poster i måldatabasen så är det bara att lägga in allting
	
	If Not ( DB_QUERY_TARGET.EOF ) Then
	
	bool_Temp = "TRUE"
	

	'-- Första frågan, är det samma artikelnr, om inte lägg till den..
		

		If ( Trim(DB_QUERY_SOURCE("col_ArticleNr")) = Trim(DB_QUERY_TARGET("col_ArticleNr")) ) Then
		
			'-- Om den finns, kontrollera att alla värden är likadana.
			
			If ( Trim(DB_QUERY_SOURCE("col_Price")) = Trim(DB_QUERY_TARGET("col_Price")) AND DB_QUERY_SOURCE("col_Price") = DB_QUERY_TARGET("col_Price") AND Trim(DB_QUERY_SOURCE("col_Group")) = Trim(DB_QUERY_TARGET("col_Group")) )  Then 
		
				'-- Är alla värdena lika skriv ut det.
				
				Response.Write("<tr><td>" & intcounter & "</td><td>" & DB_QUERY_SOURCE("col_ArticleNr") & "</td><td>" & DB_QUERY_SOURCE("col_Name") & "</td><td>Informationen har icke uppdaterats.</td></tr> ")
				
				'-- Om du inte har lagt till något så hoppa fram ett snäpp i de båda databaserna.
				
				DB_QUERY_SOURCE.MoveNext
				DB_QUERY_TARGET.MoveNext
			
			Else
			
				'-- Är dom inte lika uppdatera måldatabasen med källdatabasen.
				
				strName = Trim(DB_QUERY_SOURCE("col_Name"))
				strPrice = Trim(DB_QUERY_SOURCE("col_Price"))
				strArticleNr = Trim(DB_QUERY_SOURCE("col_ArticleNr"))
				strGroup = Trim(DB_QUERY_SOURCE("col_Group"))
				
				strSQL_write = "UPDATE tbl_Products SET col_Name = '"& strName &"', col_Price = '"& strPrice &"', col_Group = '"& strGroup &"' WHERE col_ArticleNr = '"& strArticleNr &"';"
				Set DB_QUERY_WRITE = ConnectTarget.Execute(strSQL_write)
				
				Response.Write("<tr><td>" & intcounter & "</td><td>" & DB_QUERY_SOURCE("col_ArticleNr") & "</td><td>" & DB_QUERY_SOURCE("col_Name") & "</td><td>Informationen har uppdaterats.</td></tr> ")
				
				'-- Om du inte har lagt till något så hoppa fram ett snäpp i de båda databaserna.

				DB_QUERY_SOURCE.MoveNext
				DB_QUERY_TARGET.MoveNext
				
			End If
			
			

		Else
		
		
			'-- Om den inte finns så lägg till den..
		
			strName = Trim(DB_QUERY_SOURCE("col_Name"))
			strPrice = Trim(DB_QUERY_SOURCE("col_Price"))
			strArticleNr = Trim(DB_QUERY_SOURCE("col_ArticleNr"))
			strGroup = Trim(DB_QUERY_SOURCE("col_Group"))
			
			strSQL_write = "INSERT INTO tbl_Products(col_Name, col_Price, col_ArticleNr, col_Group) VALUES('"& strName &"','"& strPrice &"','"& strArticleNr &"','"& strGroup &"');"
			
			Set DB_QUERY_WRITE = ConnectTarget.Execute(strSQL_write)
			
			Response.Write("<tr><td>" & intcounter & "</td><td>" & DB_QUERY_SOURCE("col_ArticleNr") & "</td><td>" & DB_QUERY_SOURCE("col_Name") & "</td><td>Artikeln har lagts in.</td></tr> ")
			DB_QUERY_SOURCE.MoveNext
			DB_QUERY_TARGET.MoveNext
			
		End If
		
			
	End If
Medlem sedan mars 2001290 inlägg
#2

svara då :))

Är det någom som har en inläsningsrutin som vill dela med sig ?

/t

Medlem sedan dec. 19996 721 inlägg
#3

Töm hela slavedatabasen och mata över allt från mastern.

Medlem sedan mars 2001290 inlägg
#4

det går tyvärr inte..

det är bara vissa fält som skall uppdateras..

sen kan det vara olika antal artiklar i de båda databaserna så jag antar att man får typ köra en COUNT för att kolla om den skall läggas till eller om den skall tas bort..

hmm.. varför inte.. får beta vidare på den...

/t

Medlem sedan dec. 200012 464 inlägg
#5

Om du gör insert i target så skall du inte göra någon movenext på targetrecordsetet.

Logiken för hela borde bli ungefär så här


targetEof = db_query_target.eof
sourceEof = db_query_source.eof
do while (not targetEof and not sourceEof)
   if sourceEof and not targetEof then
      op = "delete"
   elseif not SourceEof and targetEof then
      op = "insert"
   elseif db_query_target("col_ArticleNr") < db_query_source("col_ArticleNr") then
      op = "delete"
  elseif target("col_ArticleNr") = source("col_ArticleNr") then
      op = "update"
   else
      op = "insert"
   end if
   
   if op = "delete" then
      sql = "delete from tbl_products where col_ArticleNr = " & db_query_target("col_ArticleNr")
      ConnectTarget.Execute sql,,128
      forwardS = false
      forwardT = true
   elseif op = "update" then
'som tidigare
      if fields unequal then
         sql = "update tbl_products"
         ConnectTarget.Execute sql,,128
      end if
      forwardS = true
      forwardT = true
   else
      sql = "insert into tbl_products ..."
      ConnectTarget.Execute sql,,128
      forwardS = true
      forwardT = false
   end if

   if  forwardS and not sourceEof then
       db_query_source.movenext
       sourceEof = db_query_source.eof
   end if

   if  forwardT and not targetEof then
       db_query_target.movenext
       targetEof = db_query_target.eof
   end if
loop

------------------
essentitia preter non sans multiplicandum

262 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)