webForumDet fria alternativet

Script för att uppdatera databas

ASP

38 svar · 882 visningar · startad av devotion

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

Hej!

Har snickrat ihop ett script som skall ha följande funktion:

1. Söka igenom fältet ArtName och se om där finns ett sjusiffrigt nummer
2. Finns det ska detta nummer skrivas in i ArtNr mha en Update
3. Hela tabellen ska loopas igenom

Här kommer koden:

<%
function searchArticle(art)
  dim re
  set re = new regexp
  re.pattern = "(\d{7})(\d*)?" 

  set m = re.execute(art)

  if m.count then
	if len(m(0).submatches(1)) < 1 then
	  searchArticle = m(0).submatches(0)
	  exit function
	end if
  end if

  searchArticle = ""
end function
	
' Öppna databasen
' ***************
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = Application("sConn")
objConn.Open

sSQL = 	"SELECT [Id], [ArtName] FROM tblMaterial"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open sSQL, objConn, 3, 1

Do until ObjRS.EOF
	sArticleName = objRS("ArtName")
	iId = objRS("Id")
	
	dim s
	s = searchArticle(sArticleName)
	
	if len(s) > 0 then
		sEnumber = s
		sSQL = "UPDATE tblmaterial SET Modified = getdate(), ArtNr = '" & sEnumber & "' Where [Id] = " & iId & ""	 
		objConn.Execute sSQL,, 128
	else
		' Det finns inget giltigt nummer i fältet! Vad ska man göra här?!?
	end if
	objRS.Movenext 
Loop
		
objRS.Close
Set objRS = Nothing	

objConn.Close
Set objConn = Nothing
	
%>

Innan jag kör detta skulle jag vilja att någon vänlig själ tittar igenom det, så det inte blir total pannkaka av alltihop...

Jag har inte riktigt lyckats klura ut vad som ska hända om man inte får en träff på ett sjusiffrigt nummer på någon rad. Jag skulle vilja logga det på något sätt. Scriptet ska INTE avbrytas utan bara hoppa till nästa rad och där försöka hitta ett sjusiffrigt nummer.

Mvh
Henrik

Medlem sedan juni 200032 967 inlägg
#2

Till att börja med så borde du nog lägga med WHERE i din UPDATE. =)

Medlem sedan jan. 20013 582 inlägg
#3

det kan ju vara bra...

Så här?

<%
function searchArticle(art)
  dim re
  set re = new regexp
  re.pattern = "(\d{7})(\d*)?" 

  set m = re.execute(art)

  if m.count then
	if len(m(0).submatches(1)) < 1 then
	  searchArticle = m(0).submatches(0)
	  exit function
	end if
  end if

  searchArticle = ""
end function
	
' Öppna databasen
' ***************
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = Application("sConn")
objConn.Open

sSQL = 	"SELECT [Id], [ArtName] FROM tblMaterial"
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open sSQL, objConn, 3, 1

Do until ObjRS.EOF
	sArticleName = objRS("ArtName")
	iId = objRS("Id")
	
	dim s
	s = searchArticle(sArticleName)
	
	if len(s) > 0 then
		sEnumber = s
		sSQL = "UPDATE tblmaterial SET Modified = getdate(), ArtNr = '" & sEnumber & "' Where [Id] = " & iId & ""	 
		objConn.Execute sSQL,, 128
	else
		' Det finns inget giltigt nummer i fältet! Vad ska man göra här?!?
	end if
	objRS.Movenext 
Loop
		
objRS.Close
Set objRS = Nothing	

objConn.Close
Set objConn = Nothing
	
%>

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#4

Ingen?

Mvh
Henrik

Medlem sedan dec. 20025 483 inlägg
#5

Jag skulle vilja göra någonting sådant här:

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = Application("sConn")
objConn.Open

today = date()
sSQL = "update tblMaterial"                &_
       "   set modified = "& today &""     &_
       "     , artNr = substring(artName,patindex('%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][^0-9]%',artName),7)" &_
       " where artName like '%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][^0-9]%'"

objConn.execute sSQL,,128

'get and log rows not having modified = @today
sSQL = "select <fields of interest>"     &_
       "  from tblMaterial"              &_
       " where modified <> " & today

Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open sSQL, objConn, 3, 1

Do until ObjRS.EOF
	' do logging
	objRS.Movenext 
Loop
		
objRS.Close
Set objRS = Nothing	

objConn.Close
Set objConn = Nothing
Medlem sedan jan. 20013 582 inlägg
#6

Jaha.... Jag som trodde jag för en gång skull kommit på något bra.. ;) Och så kommer du med en helt annan lösning.. :D

Okej!

Kan du förklara lite närmare.. :)

Mvh
Henrik

Medlem sedan dec. 20025 483 inlägg
#7

Tanken är att först uppdatera de rader i tabellen som uppfyller villkoret att ha exakt sju på varandra följande siffror. Pattern matching-stödet i T-SQL verkar inte vara det mest välutvecklade (verifiering önskas), men med patindex() bör denna uppgift gå att lösa. Alternativet tror jag är att skriva en egendefinierad funktion som använder RegExp-objektet (en troligtvis slöare lösning).

De uppdaterade raderna har modified = 'dagens datum', så vi hämtar de andra och loggar dem. Verkar det vettigt?

Medlem sedan jan. 20013 582 inlägg
#8

Peter S skrev:

Alternativet tror jag är att skriva en egendefinierad funktion som använder RegExp-objektet (en troligtvis slöare lösning).

function searchArticle(art)
  dim re
  set re = new regexp
  re.pattern = "(\d{7})(\d*)?" 

  set m = re.execute(art)

  if m.count then
	if len(m(0).submatches(1)) < 1 then
	  searchArticle = m(0).submatches(0)
	  exit function
	end if
  end if

  searchArticle = ""
end function

Hade denna funktionen funkat?

De uppdaterade raderna har modified = 'dagens datum', så vi hämtar de andra och loggar dem. Verkar det vettigt?

Det verkar absolut vettigt!

Till en textfil kanske?

Mvh
Henrik

Medlem sedan dec. 20025 483 inlägg
#9

Jag tänkte mer en CREATE FUNCTION.

Medlem sedan jan. 20013 582 inlägg
#10

Aha.. Ok :)

Men, vågar jag köra din kod... ;)

Medlem sedan dec. 20025 483 inlägg
#11

Ja, på en kopia av originaltabellen ;)

Medlem sedan jan. 20013 582 inlägg
#12

Hehe.. ;)

Jag ska säkerhetskopiera allt....

Hur skapar jag en logtextfil då?

Mvh
Henrik

Medlem sedan dec. 20025 483 inlägg
#13

Jag är litet osäker på patindex(); vad får du för resultat av

select patindex('%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][^0-9]%','1234567') from tblMaterial

?

Loggfilen är ju en vanlig textfil, så OpenTextFile() kan vara värd att inleda med.

Medlem sedan jan. 20013 582 inlägg
#14

7859 rows, där alla är 0 (noll)

tblMaterial innehåller 7859 rows

Mvh
Henrik

Medlem sedan dec. 20025 483 inlägg
#15

Det var ingen höjdare. Jag antar då att du får 7859 '1'-rader om du skriver '1234567a' istället?

Medlem sedan jan. 20013 582 inlägg
#16

**Testar**

Medlem sedan jan. 20013 582 inlägg
#17

Precis så blev det....

Medlem sedan dec. 20025 483 inlägg
#18

Det kan fungera ändå: ligger de sju siffrorna i slutet av fältet eller finns det alltid något tecken efter dem?

Medlem sedan jan. 20013 582 inlägg
#19

Några exempel:

E 7290552 Armatur 2x18w
0283230 Oilflex N 5G0,75 6m
E7290557 3st

Mvh
Henrik

Medlem sedan dec. 20025 483 inlägg
#20

På de fälten fungerar det. Frågan är om det existerar sådana här

...7290557

I din kod skall detta fält uppdateras med dagens datum - eller hur? Problemet är att patindex(), med ovanstående mönster, inte hittar detta, såvida vi kan vara säkra på att det alltid förekommer någonting efter dessa sju siffror.

Kör

select artName from tblMaterial where artName like '%[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
262 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)