Προβλήματα με ASP, ADO

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
Luke
Gbyte level
Gbyte level
Posts: 1388
Joined: Wed Aug 09, 2006 11:19 am
Academic status: Alumnus/a
Gender:

Προβλήματα με ASP, ADO

Post by Luke » Sun Jul 29, 2007 1:25 pm

Θέλω μέσα από μια asp εφαρμογή να κατασκευάζω μια βάση σε access την οποία στη συνέχεια θα διαχειρίζομαι μέσα από τον asp κώδικά μου. Θέλω να έχω 2 πίνακες (Μaterials, Orders) στη βάση.

Μετά από κάμποσο ψάξιμο έχω καταλήξει σε αυτό τον κώδικα:
Κώδικας wrote:<%@LANGUAGE="VBSCRIPT"%> 'CODEPAGE="1252"%>

<html>
<head>
<title>Create a New Microsoft Access Database with ASP</title>
</head>
<body>
<!--#include file ="Includes/adovbs.inc"-->
<%
Dim sDatabaseName
sDatabaseName = "C:\Inetpub\wwwroot\repository\repositoryAutomatic.mdb"

Sub CreateAccessDatabase(sDatabaseToCreate)
'if this fails, the function exits immediately
Set fso = Server.CreateObject("Scripting.FileSystemObject")

' does the destination file exist already?
response.write( "Checking existence of " & sDatabaseToCreate & "...<br>")
IF fso.FileExists(sDatabaseToCreate) THEN
fso.DeleteFile( sDatabaseToCreate)
response.write( "Deleted file " & sDatabaseToCreate)
END IF
SET fso = nothing

Dim catNewDB ' As ADOX.Catalog
Set catNewDB = Server.CreateObject("ADOX.Catalog")
catNewDB.Create "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & sDatabaseToCreate & _
";Jet OLEDB:Engine Type=5;"

Set catNewDB = Nothing
response.write("Database has been created successfully!<br>")

'open the existing database and add the tables
Dim catDB ' As ADOX.Catalog
Set catDB = Server.CreateObject("ADOX.Catalog")
' Open the catalog
catDB.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & sDatabaseToCreate

' Create the "MATERIALS" table
Dim mat ' As ADOX.Table
Set mat = Server.CreateObject("ADOX.Table")
mat.Name = "MATERIALS"

' Now add the columns of the table
With mat
' Create fields and append them to the
' Columns collection of the new Table object.

With .Columns
.Append "M_CODE", adVarWChar, 5
.Append "M_DESCR", adVarWChar, 20
.Append "M_QUANTITY", adInteger, 4
.Append "M_MIN_QUANTITY", adInteger, 4
.Append "M_UNIT_PRICE", adInteger, 6
End With
.keys.append "PK_M_CODE", 1, "M_CODE"
End With

' Add the new Table to the Tables collection of the database.
catDB.Tables.Append mat
Set col = Nothing
Set mat = Nothing

'<-------------------------------------------------------------->
'<-------------------------------------------------------------->
' Create the "ORDERS" table

Dim ord 'As ADOX.Table
Set ord = Server.CreateObject("ADOX.Table")
Dim kyForeign 'As ADOX.Key
'set kyForeign = New ADOΧ.key
ord.Name = "ORDERS"

With ord
' Create fields and append them to the
' Columns collection of the new Table object.

With .Columns
.Append "M_CODE", adVarWChar, 5
.Append "O_NUM", adInteger, 4
.Append "O_QUANTITY", adInteger, 4
.Append "O_DATE", adDate
End With
'.keys.append "FK_M_CODE", 1, "M_CODE"
'.keys.append "PK_O_NUM", 1, "O_NUM"

End With

' Define the foreign key
kyForeign.Name = "MO_CODE"
kyForeign.Type = adKeyForeign
kyForeign.RelatedTable = "MATERIALS"
kyForeign.Columns.Append "M_CODE"
kyForeign.Columns("M_CODE").RelatedColumn = "M_CODE"
kyForeign.UpdateRule = adRICascade

' Append the foreign key
ord.Keys.Append kyForeign

' Add the new Table to the Tables collection of the database.
catDB.Tables.Append ord
Set col = Nothing
Set ord = Nothing
Set catDB = Nothing
End Sub

CreateAccessDatabase sDatabaseName
%>
</body>
</html>
Τα προβλήματα που έχω τώρα είναι στα σημεία με κόκκινο.
Στο 1ο σημείο "fso.DeleteFile( sDatabaseToCreate)" μου βγάζει

Code: Select all

Error Type:
Microsoft VBScript runtime (0x800A0046)
Permission denied
όταν πάει να κάνει τη διαγραφή.

Στο 2ο σημείο Dim kyForeign 'As ADOX.Key μου βγάζει

Code: Select all

Error Type:
Microsoft VBScript runtime (0x800A01A8)
Object required: ''
Όταν βγάζω από το σχόλιο την από κάτω γραμμή 'set kyForeign = New ADOΧ.key μου βγάζει

Code: Select all

Error Type:
Microsoft VBScript runtime (0x800A01FA)
Class not defined: 'ADOΧ'
ενώ αν βγάζω το σχόλιο από τη γραμμή Dim kyForeign 'As ADOX.Key επιστρέφει

Code: Select all

Error Type:
Microsoft VBScript compilation (0x800A0401)
Expected end of statement
Dim kyForeign As ADOX.Key
-------------^
Κυρίως το 2ο σημείο με ενδιαφέρει περισσότερο. Σε αντίστοιχους κώδικες στο internet είχε αυτές τις δηλώσεις χωρίς σχόλια αλλά σε εμένα δε δουλεύουν. Τι να κάνω; :-(

Έχω έκδοση ΑDO 2.8 και υποστηρίζεται ADOX, τουλάχιστον αυτά τα αποτελέσματα μου επέστρεψε το ακόλουθο script.

Code: Select all

<%@LANGUAGE=VBSCRIPT%>
<%
  ON ERROR RESUME NEXT
  SET ourObj = Server.CreateObject( "ADODB.Connection")
  Response.Write "<BR>ADODB "
  IF ERR <> 0 THEN
    Response.Write "is not "
  ELSE
    Response.Write "version " + ourObj.Version + " is "
  END IF
  Response.Write "installed on this machine"
  Err.Clear

  SET ourObj = Server.CreateObject( "ADOX.Catalog")
  Response.Write "<BR>ADOX is "
  IF ERR <> 0 THEN
    Response.Write "not "
  END IF
  Response.Write "installed on this machine<BR>"
  Err.Clear
  
  SET ourObj = nothing
%> 
Είμαι ένας μοναχικός cowboy...
User avatar
Luke
Gbyte level
Gbyte level
Posts: 1388
Joined: Wed Aug 09, 2006 11:19 am
Academic status: Alumnus/a
Gender:

Post by Luke » Mon Jul 30, 2007 2:04 am

Λοιπόν, μετά από κάμποσες ώρες μου ήρθε φλασιά και βρήκα τι έφταιγε τελικά με το 2ο πρόβλημα, αν και δεν κατάλαβα απόλυτα το γιατί (ή μάλλον υποθέτω εκ των υστέρων).

Αντί για

Code: Select all

set kyForeign = New ADOΧ.key
ήθελε

Code: Select all

set kyForeign = Server.CreateObject("ADOX.Key")
δηλαδή όπως ακριβώς δημιουργούσα και το catalog και το table. Ομολογώ πως δεν μου πέρασε από το μυαλό καθόλου αυτό το ενδεχόμενο (η noobιά στο φόρτε της :-p) καθώς καμιά δεκαριά παραδείγματα που είχα δει στο internet το είχαν με τον άλλο τρόπο και είχα επηρεαστεί. Όμως τώρα που το σκέφτομαι τα παραδείγματα αυτά έπρεπε να έπαιζαν σε Visual Studio άρα σε .NET επομένως έχει λογική η διαφορετική σύνταξη. Όλα αυτά βέβαια τα διαπιστώνω (ή μάλλον τα υποθέτω γιατί είμαι λίγο χαμένος ακόμα) εκ των υστέρων. Τι να γίνει...

Αν βρω και για το άλλο πρόβλημα κάτι, αν και δε με πειράζει και τόσο αυτό, θα το ποστάρω.

Ευχαριστώ όλους όσους είχαν το κουράγιο έστω να ρίξουν μια ματιά στο προηγούμενο μεγάλο post μου.
Είμαι ένας μοναχικός cowboy...
User avatar
Luke
Gbyte level
Gbyte level
Posts: 1388
Joined: Wed Aug 09, 2006 11:19 am
Academic status: Alumnus/a
Gender:

Post by Luke » Wed Aug 01, 2007 9:18 pm

Νέα προβλήματα, νέες απορίες.:)

Έχω τον ίδιο πίνακα Μaterials(code, description, current_quantity, min_quantity, unit_price). Θέλω μέσα από μια φόρμα να δίνω ως είσοδο την description ενός υλικού και την ποσότητα προς πώληση (άσχετο με τα 2 πεδία quantities που υπάρχουν στο σχήμα του πίνακα materials) και να μου εμφανίζει ένα αποτέλεσμα της μορφής:

Code Description Selling quantity Price per unit Total price

και από κάτω από το καθένα πεδίο η αντίστοιχη τιμή (που βρίσκεται είτε από select στον πίνακα είτε υπολογίζεται).


Το σκεπτικό μου είναι το εξής.
  1. Έχω αρχικά μια φόρμα που δίνω μόνο την περιγραφή (description).
  2. Με βάση την περιγραφή μου εμφανίζονται όλα τα υλικά (materials) με αυτή την περιγραφή και μου δίνεται η δυνατότητα μέσω ενός html "input type=text" για το κάθε υλικό που βρέθηκε να εισάγω την ποσότητα προς πώληση (selling quantity).
  3. Όλα αυτά τα δεδομένα περνούν σε μια άλλη σελίδα asp η οποία θα εμφανίσει συγκεντρωτικά όλα τα αποτελέσματα (κάποια με επιπλέον select στον πίνακα, κάποια άλλα θα υπολογιστούν), σύμφωνα με την παραπάνω μορφή.

Το πρόβλημά μου είναι η σύνδεση της 2ης με την 3η σελίδα. Έχω το παρακάτω απόσπασμα κώδικα στην 2η σελίδα (αυτή στην οποία συμπληρώνω ποσότητες για κάθε υλικό που βρέθηκε):
Κώδικας wrote: <%
'blah blah...

row = rs.getRows(count, 0)
html = html & "<FORM METHOD=POST ACTION='receipt.asp' onsubmit=fillArray(count)> <b>"
html = html & "<table border=1>"

html = html & "<tr> <td><b><I>Material code</I></b></td>"
html = html & "<td><b><I>Description</I></b></td>"
html = html & "<td><b><I>Selling quantity</I></b></td>"
html = html & "</tr>"

For x=0 to count-1
html = html & "<tr><td>" & row(0, x) & "</td>"

html = html & "<td>" & row(1, x) & "</td>"

html = html & "<td> <center><input type=text name=quantity"& x &" size=4 value=''></center> </td></tr>"
Next
html = html & "</table></b>"

response.write(html)
%>

<p align="center"><input type="submit" value="Submit" name="B1"></p>
</FORM>

Δεδομένου ότι δε γνωρίζω εκ των προτέρων το count (πλήθος των υλικών για τα οποία θα δώσω ποσότητα) δεν ξέρω πόσα διαφορετικά text fileds θα φτιάξω για την εισαγωγή των ποσοτήτων. Και επιπλέον δεν είμαι σίγουρος κατά πόσο είναι σωστός ο τρόπος που έχω χρησιμοποιήσει για την αρίθμηση (βλ. κόκκινο χρώμα).

Στην ουσία αυτό που θέλω να κάνω είναι να γεμίζω ένα array με τις τιμές των ποσοτήτων και να το στέλνω στην άλλη σελίδα. Το πώς θα το στέλνω έχω βρει πώς γίνεται :-p(μετά από ψάξιμο στο google).
Το πρόβλημά μου είναι πώς θα γεμίσω αυτό το array με τις τιμές των text fields. Σκέφτηκα να χρησιμοποιήσω javascript (αν και δε γνωρίζω σχεδόν καθόλου) και το event onsubmit κατά το οποίο θα καλείται μια function που θα γεμίζει τον πίνακα (βλ. μπλε χρώμα). Είναι σωστό σαν σκέψη αυτό;
Και πάλι όμως έχω πρόβλημα γιατί θα πρέπει να παίρνω με κάποιο τρόπο τα περιεχόμενα των text fields πριν τα κάνω post στην άλλη σελίδα (δεν είμαι σίγουρος αν είναι εφικτό κάτι τέτοιο).

Καμιά βοήθεια για το πώς μπορώ να κάνω το παραπάνω;
Tι γνώμη έχετε για το σκεπτικό μου; Μήπως πρέπει να αλλάξω τρόπο προσέγγισης;

Ευχαριστώ πολύ εκ των προτέρων.
Είμαι ένας μοναχικός cowboy...
User avatar
P3
Venus Project Founder
Venus Project Founder
Posts: 2722
Joined: Mon Mar 22, 2004 4:12 pm
Academic status: Alumnus/a
Gender:
Location: !! El Paso !!

Post by P3 » Tue Aug 07, 2007 3:38 pm

Αρχικά μέσω ενός hidden πεδίου της 1ης φόρμας να περνάς τον πλήθος των υλικών για τα οποία θα δώσω ποσότητα. Μετά αφού θα δημιουργείς ένα ξεχωριστό textfield με όνομα "quantity_i" στην 3η σελίδα θα κάνεις request τα περιεχόμενα αυτών των πεδίων εφόσον και πάλι θα ξέρεις το πλήθος τους. Δεν χρειάζεσαι τον ενδιάμεσο πίνακα, νομίζω.
"Το δικό μου το ποίημα δεν έχει ομοιοκαταληξία.", ο υπογράφων
User avatar
Luke
Gbyte level
Gbyte level
Posts: 1388
Joined: Wed Aug 09, 2006 11:19 am
Academic status: Alumnus/a
Gender:

Post by Luke » Tue Aug 07, 2007 3:55 pm

Το είχα λύσει το πρόβλημα αλλά δεν πρόλαβα να ποστάρω τη λύση καθώς τις προηγούμενες μέρες είχε πρόβλημα το venus.


Τελικά το for loop το έκανα ως εξής χωρίς να αριθμώ με ξεχωριστό όνομα κάθε text field για το quantity:

Code: Select all

For x=0 to count-1 
    html = html & "<tr><td>" & row(0, x) & "</td>" 
    html = html & "<input type=hidden name=code size=4 value='"&row(0, x)&"'>" 
    html = html & "<td>" & row(1, x) & "</td>" 
    html = html & "<input type=hidden name=descr size=20 value='"&row(1, x)&"'>" 
    html = html & "<td> <center><input type=text name=quantity size=4 value=''></center> </td></tr>" 
Next
Tελικά με αυτό τον τρόπο αποθηκεύει αυτόματα σε ένα array όλα τα quantities τα οποία μπορώ να τα τραβήξω στην επόμενη σελίδα μετά από κατάλληλη επεξεργασία. Αυτό το array γίνεται post στην άλλη σελίδα και περιέχει όλα τα qunatities χωρισμένα με ", ". Επομένως η επεξεργασία που αναφέρω παραπάνω ήταν να χρησιμοποιήσω την έτοιμη μέθοδο split() και στη συνέχεια την trim() για να αφαιρέσω τα κενά που υπήρχαν μετά το ",".

Δεν περίμενα να γίνεται τόσο αυτοματοποιημένα. Είχα την εντύπωση πως με αυτό τον τρόπο που αναφέρω θα έκανε σε κάθε loop overwrite την προηγούμενη τιμή του quantity και πως στο τέλος θα πόσταρε στην άλλη σελίδα μόνο την τιμή της τελευταίας loop. Πάντως δουλεύει μια χαρά.

Παρ΄ όλα αυτά ευχαριστώ για την απάντηση, P3.
Είμαι ένας μοναχικός cowboy...
User avatar
P3
Venus Project Founder
Venus Project Founder
Posts: 2722
Joined: Mon Mar 22, 2004 4:12 pm
Academic status: Alumnus/a
Gender:
Location: !! El Paso !!

Post by P3 » Tue Aug 07, 2007 4:21 pm

Καλή φάση αυτή με τον πίνακα, που το κάνει μόνο του. Τώρα έδωσες τρελή συμβουλή.

Anw... Anytime!
"Το δικό μου το ποίημα δεν έχει ομοιοκαταληξία.", ο υπογράφων
Post Reply

Return to “Προγραμματισμός”