webForumDet fria alternativet

Radera utgångna artiklar

Databaser & SQL

19 svar · 995 visningar · startad av devotion

Medlem sedan jan. 20013 582 inlägg
Frågan#1

Wooo! :e

Okej! :)
jag har tre tabeller:

tblArticle
----------
eNumber
articleName
articleUnit

tblPrice
-------------
eNumber
articleSupplierId
articlePrice

tblSupplier
--------------
supplierId
supplierName

Till dessa läser jag in prislistor i text-format...

När jag läser in artiklarna uppdaterar jag befintliga poster och lägger till nya om artikeln inte finns i listan.

Jag har även kod för att ta bort artiklar som utgått.

E-nummersystemet används av alla leverantörer så flera leverantörer kan ha samma artikel...

Därför är E-numret i tblArticle unikt. I tblPrice däremot kan samma E-Nummer finans med flera gånger med olikia supplierId och articlePrice

Nu till frågan:
Hur kan man lösa databasstrukturen för att koden skall ta bort en artikel om den utgått från aktuell leverantör? Det kan ju vara så att en annan leverantör har artikeln, och då ska den ju inte tas bort... Dvs den ska tas bort om endast aktuell leverantör lagerför den.

I tblPrice är det ju inga problem, där finns ju leverantörsId´t att gå efter, men det gör det ju inte i tblArticle....

Tacksam för hjälp (använder access)

Mvh
henrik

Medlem sedan dec. 200012 464 inlägg
#2
delete from tblArticle
where not exists
  (select *
      from tblPrice
    where tblPrice.eNumber = tblArticle.eNumber
        and tblPrice.articleSupplierId <> <aktuellLeverantör>)
   and eNumber = <artikelNummer>)
Medlem sedan jan. 20013 582 inlägg
#3

wee!
Det ser ju fint ut ska testa!

Tack så länge!

Mvh

Medlem sedan jan. 20013 582 inlägg
#4

Hmm okej har tittat lite mer på min kod nu...

Den ser ut så här.... (det blir lite asp också... sorry)

While not objFile.atendofstream
...

'Databasfrågor

...

allEnumbers = allEnumbers & "'" & iEnumber & "',"

...

Wend

objConn.Execute("DELETE FROM tblExArticle WHERE eNumber NOT IN ("& Left(allEnumbers,len(allEnumbers)-1) &")")

Den tar ju inte hänsyn till om någon annan leverantör har artikeln, vilket var problemet. Hur får jag ihop det med din kod Lars G??

Och vad gör:

Left(allEnumbers,len(allEnumbers)-1) &")")

asp iofs... men det hänger ju ihop...

Mvh
henrik

Medlem sedan nov. 20017 144 inlägg
#5

Din kod påminner ju inte äns om LarsGs kod.

Left(allEnumbers,len(allEnumbers)-1)

Plockar bort det sista kommatecknet ur variabeln allEnumbers.

Medlem sedan jan. 20013 582 inlägg
#6

:) nä, precis....

Det är därför jag vill ha hjälp med att få ihop det...

Jag har inte använt "min" deletekod..... för att den inte haft den funktionalliteten som jag önskade... Nu med Lars Gs kod kan jag dock få ihop det, men jag vet inte riktigt hur...

mvh
henrik

Medlem sedan dec. 200012 464 inlägg
#7

Var finns leverantörsvärdena?

Medlem sedan jan. 20013 582 inlägg
#8

:)

Hur menar du?

Mvh
henrik

Medlem sedan jan. 20013 582 inlägg
#9

Hej :)
Har pillat lite med det hela under kvällen och fått ihop något som jag tror fungerar...

Postar hela koden här även att den innehåller asp.... Kanske skulle varit i asp-forumet istället... men, men...

'Loopen
while not objFile.atendofstream
	
	'Villkor för att flusha 
   	iCounter = iCounter +1
    if iCounter mod 100 = 0 then
		Response.write ("<script>document.getElementById(""progress"").innerHTML=""" & iCounter & """;</script>")
        Response.flush
    end if

    sLine = objFile.ReadLine
	
	'Ta ut de olika delarna ur textfilen
    sEnumber = SQLSafe(Trim(Mid(sLine, 1, 8)))
	sArticlename = SQLSafe(Trim(Mid(sLine, 39, 46)))
	sUnit = SQLSafe(Trim(Lcase(Mid(sLine, 21, 3))))
	sCategory = SQLSafe(Trim(Mid(sLine, 17, 4)))
	curPrice = SQLSafe(Trim(Mid(sLine, 9, 8)))

	'Uppdatera tblExArticle om artikeln redan finns
	sSQL = "UPDATE tblExArticle SET eNumber = '" & sEnumber & "', articleName = '" & sArticleName & "', articleUnit = '" & sUnit & "' WHERE eNumber = '" & sEnumber & "'"
    objConn.Execute sSQL, lngRA, 128

	if lngRa = 0 then
		'Lägga till artikeln i tblExArticle om den inte finns
    	sSQL = "INSERT INTO tblExArticle (eNumber, articleName, articleUnit) VALUES ('" & sEnumber & "', '" & sArticleName & "', '" & sUnit & "')"		
    	objConn.Execute sSQL,,128
	End if
	
	'Uppdatera tblExPrice om artikeln redan finns
	sSQL = 	"UPDATE tblExPrice SET eNumber = '" & sEnumber & "', articleSupplierId = '" & iSupplierId & "', articlePrice = " & curPrice & ", " &_ 
			"articleCategory = '" & sCategory & "' WHERE eNumber = '" & sEnumber & "' AND articleSupplierId = " & iSupplierId
	objConn.Execute sSQL, lngRA, 128

	if lngRA = 0 then
		'Lägga till artikeln i tblExPrice om den inte finns
		sSQL =  "INSERT INTO tblExPrice (eNumber, articleSupplierId, articlePrice, articleCategory) " &_
				"VALUES ('" & sEnumber & "', " & iSupplierId & ", " & curPrice & ", '" & sCategory & "')"
		objConn.Execute sSQL
	End If	 
	
	'Skapa en variabel innehållandes alla E-numrena från prilistefilen 
	sAllEnumbers = sAllEnumbers & "'" & sEnumber & "',"

wend

'Plocka bort det sista kommat i strängen med alla E-numrena
sAllEnumbers = Left(sAllEnumbers,len(sAllEnumbers)-1)

'Ta bort alla Artiklar som inte finns med i den nya prislistan från tblExArticle
sSQL =  "DELETE FROM tblExArticle WHERE NOT exists " &_ 
		"(SELECT * FROM tblExPrice WHERE tblExPrice.eNumber = tblExArticle.eNumber AND tblExPrice.articleSupplierId <> " & iSupplierId & ") " &_
   		"and eNumber not in ("& sAllEnumbers &")"
objConn.Execute(sSQL)

'Ta bort alla artiklar som inte finns i den nya prislistan från tblExPrice
sSQL = "DELETE FROM tblExPrice WHERE eNumber NOT IN ("& sAllEnumbers &") And ArticleSupplierId = " & iSupplierId & ""
objConn.Execute(sSQL)

Är detta en bra lösning eller går det att göra bättre... strängen med alla enummer sAllEnumbers blir ju väldigt stot tex.. en prislista innehåller ca 60 000 artiklar.

Tacksam för feedback och synpunkter...

Mvh
henrik

Medlem sedan jan. 20013 582 inlägg
#10

LarsG skrev:

Var finns leverantörsvärdena?

Hur menar du... Finns det någon bättre lösning?

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#11

Kan man göra samma sak som det min kod gör utan att lägga alla E-nummer i sAllEnumber? Det blir väldigt segt...

Mvh
henrik

Medlem sedan jan. 20013 582 inlägg
#12

Hej! :)

Nu ser min kod ut så här:

	'Uppdatera tblExArticle om artikeln redan finns
	sSQL = "UPDATE tblExArticle SET eNumber = '" & sEnumber & "', articleName = '" & sArticleName & "', articleUnit = '" & sUnit & "' WHERE eNumber = '" & sEnumber & "'"
    objConn.Execute sSQL, lngRA, 128

	if lngRa = 0 then
		'Lägga till artikeln i tblExArticle om den inte finns
    	sSQL = "INSERT INTO tblExArticle (eNumber, articleName, articleUnit) VALUES ('" & sEnumber & "', '" & sArticleName & "', '" & sUnit & "')"		
    	objConn.Execute sSQL,,128
	End if
	
	'Uppdatera tblExPrice om artikeln redan finns
	sSQL = 	"UPDATE tblExPrice SET eNumber = '" & sEnumber & "', articleSupplierId = '" & iSupplierId & "', articlePrice = " & curPrice & ", " &_ 
			"articleCategory = '" & sCategory & "' WHERE eNumber = '" & sEnumber & "' AND articleSupplierId = " & iSupplierId
	objConn.Execute sSQL, lngRA, 128

	if lngRA = 0 then
		'Lägga till artikeln i tblExPrice om den inte finns
		sSQL =  "INSERT INTO tblExPrice (eNumber, articleSupplierId, articlePrice, articleCategory) " &_
				"VALUES ('" & sEnumber & "', " & iSupplierId & ", " & curPrice & ", '" & sCategory & "')"
		objConn.Execute sSQL
	End If	 
	
	'Lägga till alla E-nummer i en tabell som senare används för att ta bort utgångna artiklar
	sSQL = "Insert into tblExTempEnumber (eNumber) Values ('" & sEnumber & "')"
	objConn.Execute sSQL
	iEnumberCount = iEnumberCount + 1
wend

'Ta bort alla Artiklar som inte finns med i den nya prislistan från tblExArticle
sSQL =  "DELETE FROM tblExArticle WHERE NOT exists " &_ 
		"(SELECT * FROM tblExPrice WHERE tblExPrice.eNumber = tblExArticle.eNumber AND tblExPrice.articleSupplierId <> " & iSupplierId & ") " &_
   		"and eNumber not in (SELECT eNumber FROM tblExTempEnumber)"
objConn.Execute(sSQL)

'Ta bort alla artiklar som inte finns i den nya prislistan från tblExPrice
sSQL = "DELETE FROM tblExPrice WHERE eNumber NOT IN (SELECT eNumber FROM tblExTempEnumber) And ArticleSupplierId = " & iSupplierId & ""
objConn.Execute(sSQL)

'Ta bort alla artiklar från tblExTempEnumber
sSQL = "DELETE FROM tblExTempEnumber"
objConn.Execute(sSQL)

Är den något att ha!

Medlem sedan juni 200032 967 inlägg
#13

Jag tycker det ser ganska bra ut. :)

Det är några ställen som saknar ,,128 vid exekveringen av SQL-frågor, det kan du ju alltid lägga till.
Sedan har Access en liten förmåga att växa rätt ordentligt när man gör dylika ting, så se om du kan lägga in kod för att komprimera databasen också.

mvh

Medlem sedan jan. 20013 582 inlägg
#14

Hur lägger man in kod för komprimering av databasen då... det vore ju käckt att avsluta med det...

Jag vet att jag gjort några sådana operationer direkt i access, och då har databasstorleken ökat från 30 Mb till närmare 100 :(

Mvh

Medlem sedan juni 200032 967 inlägg
#15

devotion skrev:

Hur lägger man in kod för komprimering av databasen då... det vore ju käckt att avsluta med det...

Jag har inte en aning, men jag provade wFs sökfunktion och hittade detta: http://www.webforum.nu/showthread.php?t=127058

Medlem sedan jan. 20013 582 inlägg
#16

den är bra, sökfunktionen....

:)

Mvh
henrik

Medlem sedan jan. 20013 582 inlägg
#17

Hej!
Då jag inte gått till botten med detta postar jag igen och hoppas någon har en bra lösning!

Koden jag har fungerar bra för ett begränsat antal artiklar. Men eftersom det rör sig om 60 000 eller mer så fungerar det inte utan datorn låser sig (eller det tar för lång tid).

Finns det något sätt att lösa detta på?

Har (tyvärr) access.

Mvh
Henrik

	'Uppdatera tblExArticle om artikeln redan finns
	sSQL = "UPDATE tblExArticle SET eNumber = '" & sEnumber & "', articleName = '" & sArticleName & "', articleUnit = '" & sUnit & "' WHERE eNumber = '" & sEnumber & "'"
    objConn.Execute sSQL, lngRA, 128

	if lngRa = 0 then
		'Lägga till artikeln i tblExArticle om den inte finns
    	sSQL = "INSERT INTO tblExArticle (eNumber, articleName, articleUnit) VALUES ('" & sEnumber & "', '" & sArticleName & "', '" & sUnit & "')"		
    	objConn.Execute sSQL,,128
	End if
	
	'Uppdatera tblExPrice om artikeln redan finns
	sSQL = 	"UPDATE tblExPrice SET eNumber = '" & sEnumber & "', articleSupplierId = '" & iSupplierId & "', articlePrice = " & curPrice & ", " &_ 
			"articleCategory = '" & sCategory & "' WHERE eNumber = '" & sEnumber & "' AND articleSupplierId = " & iSupplierId
	objConn.Execute sSQL, lngRA, 128

	if lngRA = 0 then
		'Lägga till artikeln i tblExPrice om den inte finns
		sSQL =  "INSERT INTO tblExPrice (eNumber, articleSupplierId, articlePrice, articleCategory) " &_
				"VALUES ('" & sEnumber & "', " & iSupplierId & ", " & curPrice & ", '" & sCategory & "')"
		objConn.Execute sSQL
	End If	 
	
	'Lägga till alla E-nummer i en tabell som senare används för att ta bort utgångna artiklar
	sSQL = "Insert into tblExTempEnumber (eNumber) Values ('" & sEnumber & "')"
	objConn.Execute sSQL
	iEnumberCount = iEnumberCount + 1
wend

'Ta bort alla Artiklar som inte finns med i den nya prislistan från tblExArticle
sSQL =  "DELETE FROM tblExArticle WHERE NOT exists " &_ 
		"(SELECT * FROM tblExPrice WHERE tblExPrice.eNumber = tblExArticle.eNumber AND tblExPrice.articleSupplierId <> " & iSupplierId & ") " &_
   		"and eNumber not in (SELECT eNumber FROM tblExTempEnumber)"
objConn.Execute(sSQL)

'Ta bort alla artiklar som inte finns i den nya prislistan från tblExPrice
sSQL = "DELETE FROM tblExPrice WHERE eNumber NOT IN (SELECT eNumber FROM tblExTempEnumber) And ArticleSupplierId = " & iSupplierId & ""
objConn.Execute(sSQL)

'Ta bort alla artiklar från tblExTempEnumber
sSQL = "DELETE FROM tblExTempEnumber"
objConn.Execute(sSQL)
Medlem sedan jan. 20013 582 inlägg
#18

Hej.... :(

Ingen som har en bra lösning på detta delikata problem...

//Henrik

Medlem sedan jan. 20013 582 inlägg
#19

Nu har jag bytt ut min skräpdatabas (access) ;) mot SQL-server....

Då kanske det finns en lösning?

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#20

Jaha!

Efter byte av databas så fungerar ovanstående lösning.....

Verkar som att access inte klarade av en sådan opreration... Det gjorde dock SQL-server utan problem...

Så nu fungerar det! Och jag avslutar denna tråden...

Mvh
Henrik

265 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)