webForumDet fria alternativet

Skapa textfil från databas

ASP

11 svar · 619 visningar · startad av devotion

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

Hej! :)
Jag har ju gjort script som läser in en textfil i en databas...

Kan man göra tvärtom, dvs hämta data från en databas och skapa en textfil med ett visst format? Om man kan det hur gör man?

mvh
Henrik

Medlem sedan juni 200032 967 inlägg
#2

Det är klart man kan.
Lite stränghanteringsfunktioner, och använd FSO för att skapa och skriva till textfilen.

Du kan ju börja med att bygga upp en sträng som ser ut som en rad som du vill skriva till filen, och sedan är filskrivningen en kakbit.

mvh

Medlem sedan jan. 20013 582 inlägg
#3

Hepp!

Gjorde s å här och det fjunkar ju...

<%
dim objConn, objRS, sSQL, fsObj,tfile

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

set fsObj=Server.CreateObject("Scripting.FileSystemObject")
set tfile=fsObj.CreateTextFile(server.MapPath("/prisfiler/solar.txt"))

sSQL = 	"SELECT tblArticle.articlenumber, tblArticle.articleName, tblPrice.articlePrice, tblPrice.articleCategoryNumber, tblArticle.articleUnit, " &_
		"tblCategory.CategoryName, tblCategory.categoryNumber, tblDiscount.articleDiscount, tblSupplier.SupplierName, tblSupplier.SupplierId, " &_
		"CASE WHEN articleDiscount is null THEN articlePrice ELSE articlePrice*(1-([articleDiscount]*0.01)) END AS articlePriceWithDiscount " &_
		"FROM tblArticle " &_
		"INNER JOIN tblPrice ON tblArticle.articlenumber = tblPrice.articleNumber " &_
		"INNER JOIN tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId " &_
		"LEFT OUTER JOIN tblDiscount ON tblPrice.articleCategoryNumber = tblDiscount.categoryNumber AND tblPrice.articleSupplierId = tblDiscount.supplierId " &_
		"LEFT OUTER JOIN tblCategory ON tblPrice.articleSupplierId = tblCategory.supplierId AND tblPrice.articleCategoryNumber = tblCategory.categoryNumber " &_
		"WHERE tblSupplier.supplierId = 1 " &_
		"ORDER BY tblArticle.articlenumber"
		
Set objRS = Server.Createobject("ADODB.Recordset")
objRS.Open sSQL, objConn, 1, 2

Do while not objRS.EOF
	
	sArticleNumber = objRS("articleNumber")
	sArticleName = objRS("articleName")
	dArticlePrice = cdbl(objRS("articlePrice"))
	
	sLine = sArticleNumber & "     " & sArticleName & "      " & dArticlePrice
	tfile.WriteLine(sLine)
	
	objRS.Movenext 
Loop 

objRS.Close
Set objRS = Nothing

tfile.close
set tfile=nothing
set fsObj=nothing
%>

Men hur gör jag för att få fasta startpositioner för de olika variablerna i strängen sLine?

sLine = sArticleNumber & "     " & sArticleName & "      " & dArticlePrice

säg att jag vill att:
sArticleNumber ska börja position 1
sArticleName ska börja position 10
dArticlePrice ska börja position 60

Hur gör man då?

Mvh
Henrik

Medlem sedan dec. 19996 721 inlägg
#4

Gör en liten funktion som ser till att en sträng alltid blir av en viss längd.

function GetFixedWidthString(stringVal,length)
   GetFixedWidthString=left(stringVal & string(length," "),length)
end function

...och sedan är det ännu en kakbit.

Medlem sedan jan. 20013 582 inlägg
#5

hmmmm... :(

Nu är jag inte riktigt med, som vanligt..

Säg att jag vill att formatet på textfilen ska vara så här:

0000040    Kabel 1                                       125
0001289    Kabel 2                                       150
1259861    Strömbrytare                                  256

Hur använder jag funktionen?

Mvh
Henrik

Medlem sedan jan. 20011 154 inlägg
#6

Borde väl gå att peta in en &vbtab eftersom det ska skrivas ut i en ren textfil

Medlem sedan apr. 20031 660 inlägg
#7

HEJ!

Annars räcker det kanske med ; , : eller annat lämpligt tecken emellan?

Ang koden använder man den väl med GetFixedWidthString(sArticleName,10) så får du en sträng som är 10 tecken lång, med mellanslag för de positioner som du inte sArticleName täcker upp.

Medlem sedan jan. 20013 582 inlägg
#8

J.N. skrev:

HEJ!

Annars räcker det kanske med ; , : eller annat lämpligt tecken emellan?

Ang koden använder man den väl med GetFixedWidthString(sArticleName,10) så får du en sträng som är 10 tecken lång, med mellanslag för de positioner som du inte sArticleName täcker upp.

Hej!

Det går inte ha några tecken mellan. Det måste vara fasta positioner.... Men jag ska testa emissions fina funktion, nu när jag vet hur den funkar! ;)

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#9

Hepp!
Så här fick det bli, med emissions finfina funktion:

<%
dim objConn, objRS, sSQL, fsObj,tfile

function GetFixedWidthString(stringVal,length)
   GetFixedWidthString=left(stringVal & string(length," "),length)
end function

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

set fsObj=Server.CreateObject("Scripting.FileSystemObject")
set tfile=fsObj.CreateTextFile(server.MapPath("/prisfiler/solar.txt"))

sSQL = 	"SELECT tblArticle.articlenumber, tblArticle.articleName, tblPrice.articlePrice, tblPrice.articleCategoryNumber, tblArticle.articleUnit, " &_
		"tblCategory.CategoryName, tblCategory.categoryNumber, tblDiscount.articleDiscount, tblSupplier.SupplierName, tblSupplier.SupplierId, " &_
		"CASE WHEN articleDiscount is null THEN articlePrice ELSE articlePrice*(1-([articleDiscount]*0.01)) END AS articlePriceWithDiscount " &_
		"FROM tblArticle " &_
		"INNER JOIN tblPrice ON tblArticle.articlenumber = tblPrice.articleNumber " &_
		"INNER JOIN tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId " &_
		"LEFT OUTER JOIN tblDiscount ON tblPrice.articleCategoryNumber = tblDiscount.categoryNumber AND tblPrice.articleSupplierId = tblDiscount.supplierId " &_
		"LEFT OUTER JOIN tblCategory ON tblPrice.articleSupplierId = tblCategory.supplierId AND tblPrice.articleCategoryNumber = tblCategory.categoryNumber " &_
		"WHERE tblSupplier.supplierId = 1 " &_
		"ORDER BY tblArticle.articlenumber"
		
Set objRS = Server.Createobject("ADODB.Recordset")
objRS.Open sSQL, objConn, 1, 2

Do while not objRS.EOF
	
	sArticleNumber = GetFixedWidthString(objRS("articleNumber"), 10)
	sArticleName = GetFixedWidthString(objRS("articleName"), 55)
	dArticlePrice = GetFixedWidthString(cdbl(objRS("articlePrice")), 80)
	
	sLine = sArticleNumber & sArticleName & dArticlePrice
	tfile.WriteLine(sLine)
	
	objRS.Movenext 
Loop 

objRS.Close
Set objRS = Nothing

tfile.close
set tfile=nothing
set fsObj=nothing
%>

Tackar!

Mvh
Henrik

Medlem sedan dec. 19996 721 inlägg
#10

Perverskt! (y)

Medlem sedan nov. 20017 144 inlägg
#11

OT: Kan du inte lägga din långa sql-sats i en stored procedure.
Det är lite väl mycket konkantenerande... ;)

Medlem sedan jan. 20013 582 inlägg
#12

Jo, det kan jag... Jag har dock inte använt mig av SP innan, så någon måste visa.... :D

Mvh
Henrik

272 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
147 ms — hämta tråd, inlägg och bilagor (db)
117 ms — ändringar (db)