Sun 15 Jan 2006 14:59:43
สวัสดีครับ มาอีกแล้วครับ กับคำถามน่าปวดหัว ขอรบกวนหน่อยนะครับ คือว่า
ตามโค้ดข้างล่างนี้นะครับ
<%
Set Conn=Server.Createobject("ADODB.Connection")
conn.Open "Provider=sqloledb;" & _
"Data Source=(local);" & _
"Initial Catalog=TeafficDB;" & _
"User Id=sa;" & _
"Password=bit69"
Set rs=Server.CreateObject("ADODB.Recordset")
Sql="Select A.IdentityCard,A.Name,A.OrderDate,A.ValuesAdjust,A.CaseID,d.Story,d.CaseID_1,d.IdentityCard,d.OrderYesOrNo "&_
"from TblOrder A INNER JOIN TblOrderDetail d ON A.CaseID=d.CaseID Where A.CaseID='"&Request.QueryString("id")&"'"
rs.open sql, conn, 1, 3
myIdentityCard=rs("IdentityCard")
if Not(rs.EOF )then
While Not Rs.EOF
Response.Write "คดีที่:"&rs("CaseID")&"/ "&rs("CaseID_1")&"<br>"
Response.Write "ค่าปรับ:"&rs("ValuesAdjust")&"<br>"
Response.Write "ข้อหา:"&rs("Story")&"<br>"
Response.Write "วันที่:"&rs("OrderDate")&"<br>"
Response.Write "รหัสประจำตัว:"&rs("IdentityCard")&"<br>"
Response.Write "ชื่อ:"&rs("Name")&"<br>"
Rs.MoveNext
Wend
Rs.Close
Conn.Close
end if
%>
</p>
<form name="form1" method="post" action="">
<input type="submit" name="Submit" value="Print" onClick="window.print()">
</form>
'-----------------------------ฐานข้อมูบครับ OrderDetaii------------------
-CaseID
-Story
-ConfirmOrder
'-------------------------------------
คือตอนนี้ผมนำดึงเอาข้อมูลจากฐานข้อมูลมาเพื่อที่ออกใบเสร็จนะครับ แต่ปัญหาคือว่าเวลาที่ผมคลิกที่ปุ่ม Print แล้วผมอยากจะให้ทำการ Update ข้อค่า คือ 1 ลงใน field "ConfirmOrder" นะครับ ซึ่ง field "ConfirmOrder" ผมกำหนดค่าตายตัวในฐานข้อมูลให้เป็น 0 เสมอครับ
อยากจะให้เวลาที่เรา Print แล้วทำการ Update ค่าคือ 1 ลงใน field "ConfirmOrder" ไม่ทราบว่าพอจะมีวิธีหรือป่าวครับ
หรือว่ามีแนวคิดอื่นที่ดีและง่ายกว่านี้ครับ ช่วยรบกวนแนะนำผมหน่อยนะครับ
----ขอบคุณครับ------
1. ใน attribute ของ button นี้ให้ใส่คำสั่ง window.open('update.asp?id=<% response.write request.querystring("id") %>','update','width=50,height=50,toolbars=no,status=no') ; ก่อนหน้าคำสั่ง window.print() เพื่อเรียกไฟล์ update.asp โดยมีการส่งค่า parameter id ซึ่งเป็นเลขที่ของ caseid ไปด้วย ซึ่งในไฟล์ update.asp นั้นก็ให้มีการเขียนคำสั่งเพื่อ update ลงในฐานข้อมูลโดยอ้างจาก querystring เอาครับ
2. ในส่วนของ form นั้นให้ใส่ attribute action มาที่ตัวของมันเอง โดยทำการเพิ่ม hidden field ลงใน form นี้เช่น
<form action="print.asp" method="post">
<input type="hidden" name="id" value="<% response.write request.querystring("id") %>">
<input type="submit" value="Print" onclick="window.print()">
</form>
โดยในใส่คำสั่ง update ก่อนการ query นำข้อมูลออกมาแสดงผล โดยมีการเช็คว่ามีการ post ค่ามายังไฟล์นี้ด้วยตัวแปรครบถ้วยหรือไม่ และมาจากตัวมันเองหรือไม่
โดยเช็คจากตัวแปร request.form("id") ว่ามีการส่งค่ามาหรือไม่และ request.server("HTTP_REFERER") ว่ามีชื่อไฟล์ตัวมันเองอยู่ในนั้นหรือไม่ (HTTP_REFERER นั้นจะเป็นการแสดง path ทั้งหมดจนมาถึงตัวไฟล์ที่มีการส่งค่ามา จึงต้องหาค่าชื่อไฟล์หลัง / สุดท้าย ครับ)
ัทั้ง 2 วิธีนี้ควรมีตัวแปรอีกตัวเพื่อใช้ในการเข้ารหัสเพื่อใช้ในการตรวจสอบข้อมูลที่ส่งไปครับ
Mon 16 Jan 2006 23:02:22
ผม update ลงฐานข้อมูลไม่ได้ครับ ตามนี้นะครับ
<% myID=Request.QueryString("id")
Response.Write myID&"<br>"
Set Conn=Server.Createobject("ADODB.Connection")
conn.Open "Provider=sqloledb;" & _
"Data Source=(local);" & _
"Initial Catalog=TeafficDB;" & _
"User Id=sa;" & _
"Password=bit69"
Sql ="Select * From TblOrderDetail Where CaseID="&Request.Form("myID")
Set RS=Server.CreateObject("ADODB.Recordset")
one=1
response.write one
RS.open Sql,Conn,1,3
Rs("ConfirmOrder")=one
Rs.Update
Conn.Close
%>
คือไม่สามารถ update ได้นะครับ แสดง Error ดังนี้ครับ
Error Type:
Microsoft OLE DB Provider for SQL Server (0x80040E14)
Line 1: Incorrect syntax near '='.
ไม่ทราบว่าเป็นเพราะอะไรเหรอครับ หรือว่าผมต้อง update ทุก field ครับ ช่วยแก้ไขให้หน่อยนะครับ
ขอบคุณมากครับ
ผมว่าลองใช้คำสั่ง SQL ดีกว่าไหมครับ "UPDATE TblOrderDetail SET ConfirmOrder=1 WHERE CaseID="&Request.Form("myID")
ผมว่าแบบนี้ชัวร์กว่าครับ
Tue 17 Jan 2006 16:04:37
ยังไม่ได้นะครับ
<% myID=Request.QueryString("id")
Response.Write myID&"<br>"
Set Conn=Server.Createobject("ADODB.Connection")
conn.Open "Provider=sqloledb;" & _
"Data Source=(local);" & _
"Initial Catalog=TeafficDB;" & _
"User Id=sa;" & _
"Password=bit69"
Sql="UPDATE TblOrderDetail SET ConfirmOrder=1 WHERE CaseID="&Request.Form("myID")
Conn.Close
%>
ไม่ Error นะครับ แต่ไม่ update ครับ
Tue 17 Jan 2006 16:54:11
แก้ไขหน่อยนะครับ ตอนนี้ update ได้แล้วครับ ขอบคุณครับ
Tue 17 Jan 2006 22:08:12
เราสามารถที่จะตรวจสอบได้หรือป่าวครับ คือผมสงสัยว่าเวลาที่เราคลิกที่ปุ่ม Print แล้วจะเกิด Dialogbox เพื่อให้เลือกเครื่อง Print นะครับแต่ถ้าหาว่าเราไม่ Print ละครับเราคลิกที่ Cancel ละครับ มันก็ยังจะ Update ค่าให้เป็น 1 อยู่ดี พอจะมีวิธีหรือป่าวครับที่พอคลิกที่ Cancle ไม่ทำการ Print แล้วไม่ให้มัน update นะครับ
Thu 19 Jan 2006 11:32:01
รบกวนหน่อยนะครับ คือว่า ผมดึง field ๆ หนึ่งมาจากฐานข้อมูลซึ่งในที่เป็นตัวเลขนะครับ (ค่าปรับ)คืออยากจะให้อ่านค่านั้นเป็นตัวหนังสือนะครับ เช่น ค่าปรับเป็น 100 อ่านเป็น "หนึ่งร้อยบาท" ประมาณนี้นะครับ พอจะช่วยเหลือผมหน่อยได้หรือป่าวครับ ขอรบกวนหน่อยนะครับ
Sat 21 Jan 2006 20:09:04
ช่วยหน่อยนะครับ คือผมเก็บข้อมูลวันที่ รูปแบบอย่างนี้นะครับ 21 มกราคม 2549 เวลา : 17:06:51 (<%=FormatDateTime(now,1) คือเวลาที่ผมจะค้นหาข้อมูลผมสร้าง combobox มา 2 อันนะครับ combobox อันแรกเป็น เดือน อันที่ 2 เป็น ปี ถ้าหาเลือกเดือนและปี แล้วคลิกที่ปุ่มค้นหาก็ให้แสดงข้อมูลระหว่างเดือนนั้นออกมานะครับ
*เวลาค้นหาผมไม่ได้ทำวันที่ให้เลือกนะครับ
รบกวนหน่อยนะครับ
จากนั้นก็ทำการ SELECT โดยการใส่ WHERE CLAUSE ว่า "field_date>='" & start_month & "' AND field_date<= '" & end_month & "'"
ประมาณนี้ครับ แต่ฟังก์ชั่นของ VB ในการสร้าง date นั้นไม่แน่ใจครับ (ไม่ถนัดจริงๆ) คงต้องรบกวนให้ลองดูฟังก์ชั่นเกี่ยวกับ DateTime ดูครับ
Sun 22 Jan 2006 09:52:12
ช่วยดูให้ผมหน่อยนะครับ
<%
numbertochange = cstr(request.querystring("id"))
lennum = len(numbertochange)
dim numarray()
redim numarray(lennum-1)
for i = 0 to lennum-1
numarray(i) = mid(numbertochange,i+1,1)
select case numarray(i)
case "1":
numarray(i)="หนึ่ง"
case "2":
numarray(i) = "สอง"
case "3":
numarray(i) = "สาม"
case "4":
numarray(i) = "สี่"
case "5":
numarray(i) = "ห้า"
case "6":
numarray(i) = "หก"
case "7":
numarray(i) = "เจ็ด"
case "8":
numarray(i) = "แปด"
case "9":
numarray(i) = "เก้า"
case "0":
numarray(i) = "ศูนย์"
end select
next
dim digitword()
redim digitword(lennum-1)
for j = 0 to lennum-1
select case j
case 0:
digitword(j)= ""
case 1:
digitword(j) = "สิบ"
case 2:
digitword(j) = "ร้อย"
case 3:
digitword(j) = "พัน"
case 4:
digitword(j) = "หมื่น"
case 5:
digitword(j) = "แสน"
case 6:
digitword(j) = "ล้าน"
case else:
if j mod 6 = 0 then digitword(j) = "ล้าน" else digitword(j) = digitword(j mod 6)
end select
next
wordnum = ""
for k = 0 to lennum-1
if (digitword(lennum-1-k)="สิบ") and (numarray(k) = "สอง") then numarray(k) = "ยี่"
if numarray(k) = "หนึ่ง" and (lennum-k < ubound(digitword)) then
if ((lennum-k > 0) and digitword(lennum-k)="สิบ") then numarray(k) = "เอ็ด"
if digitword(lennum-1-k)="สิบ" then numarray(k) = ""
end if
if numarray(k) <> "ศูนย์" then wordnum = wordnum&numarray(k)&digitword(lennum-1-k)
if numarray(k) = "ศูนย์" and (((lennum-1-k) mod 6)=0) then wordnum = wordnum&digitword(lennum-1-k)
next
response.write(numbertochange&" = "&wordnum)
%>
ถ้าหากว่าผมรับค่ามาจากอีกหน้าหนึ่งมันจะสามารถที่จะอ่านได้ถูกต้องนะครับแต่ถ้าไม่ได้ทำการรับแต่มาจากหน้าอื่นแต่ผมดึงตัวเลขมาจาก field ๆ หนึ่ง เช่น fielde นั้นมีค่าเป็น 300 มันจะอ่านเป็น "300 = สามพัน ล้าน แสน หมื่น พัน ร้อย สิบ " ซึ่งหลักอื่นปนมาด้วยนะครับช่วยแก้ไขให้ผมหน่อยนะครับ
ต้องขออภัยจริงๆครับ
Sun 22 Jan 2006 14:23:38
ต่ออีกหน่อยนะครับ เกี่ยวกับการค้นหาข้อมูลระหว่างเดือนและปี คือมี field ๆ หนึ่งชื่อว่า OrderDate เก็บข้อมูลเป็น nvarchar นะครับ ตัวอย่างข้อมูลที่เก็บ 22 มกราคา 2549 10:20:3
แล้วผมสร้าง page มาหน้าหนึ่ง มี combobox 2 ตัวคือ เดือน และปี แล้วส่งมายังอีกหน้าหนึ่ง ซึ่งหน้านี้ผมรับค่าจาก combobox ทั้ง2 ตัวอย่างนี้นะครับ
myMonth=Request.Form("Month")
myYear=Request.Form("year")
MY=myMonty&""&myYear
ผมเอามาต่อกันนะครับแล้วทำการ query ข้อมูล ดังนี้นะครับ
sql="select * from TblOrder where OrderDate like '" &MY & "%'"
ซึ่งพอรับค่าแล้วค้นหา ไม่สามารถค้นหาได้นะครับ ทั้งที่มีข้อมู่ลอยู่ มันจะไม่มีค่าอะไรแสดงออกมาเลยนะครับ พอมีวิธีแก้ไขหรือป่าวครับ
ลองแบบนี้ดูครับเนื่องจาก หน้าเดือนยังมีเลขวันที่อีกครับ
(ไม่ลองใช้ field เป็น DateTime ดูละครับถ้าใช้ในการ Search จะเพิ่ม Performance โดยรวมได้ครับ จะเห็นชัดในกรณีถ้ามี record มากๆ)
Mon 23 Jan 2006 00:22:14
ได้แล้วครับ ขอบคุณมากครับ
และอีกหน่อยนะครับ หน้า order ผมมี form อยู่ 1 form มี textbox อยู่ 2 อันที่จะส่งค่าไปยังหน้า order1 แล้วมีปุ่ม submit อยู่ 1 ปุ่มนะครับ พอผมกดปุ่ม submit แล้วมันจะส่งค่า textbox 2 อันนี้ไปยังหน้า order1 ปัญหาคือผมอยากให้หน้า order1 ที่รับค่ามาจาก order ไม่ต้องมีพวก menubar,toolbar นะครับ พอจะมีวิธิหรือป่าวครับ
ขอรบกวนหน่อยนะครับ
Mon 23 Jan 2006 19:58:30
ส่งแบบ get แล้วทำยังงัยต่อละครับ ตอนคลิกที่ปุ่มผมใส่ค่าอย่างนี้นะครับ
value= window.open('order1.asp?id=<% response.write request.querystring("id") %>','update','width=50,height=50,toolbars=no,status=no') ;
ซึ่งแบบนั้ก็สามารถบังคับให้ order1 ไม่มีพวก toolbar,menubar ได้นะครับ แต่มันส่งไปค่าเดียวนะครับ คือค่า id แต่แบบนี้จะส่งได้เพียงค่าเดียวถ้าจะส่งไปสองค่าละครับ ซึ่งชื่อตัวแปรก็ต่างกันด้วยนะครับ พอจะได้หรือป่าวครับ
ประมาณนี้แล
Wed 25 Jan 2006 23:33:54
ครับผมมีคำถามอีกแล้วครับ เกี่ยวกับการค้นหาครับคืออย่างนี้นะครับ
<%if Request.Form("key")="" then
Response.write("<br><font size=5 color=red>คุณยังไม่ได้กรอกข้อมูลที่ต้องการค้นหา</font>")
else
Set Conn=Server.Createobject("ADODB.Connection")
conn.Open "Provider=sqloledb;" & _
"Data Source=(local);" & _
"Initial Catalog=TeafficDB;" & _
"User Id=sa;" & _
"Password=bit69"
Set RS =Server.CreateObject("ADODB.Recordset")
myKey = request("key")
Select Case Request.Form("sType")
Case 0
sql = "Select * from Tblperson where IdentityCard like '" & myKey & "%'"
Case 1
sql = "Select * from Tblperson where Name like '" & myKey & "%'"
end Select
RS.open Sql,Conn,1,3
%>
ตาม code ที่แสดงให้ดูจะเป็นการค้นหาตามเงื่อนไขที่ทำการเลือกนะครับ ปัญหาคือเวลาที่ผมค้นหาตามชื่อ เช่น "กติติ สว่างศรี" เวลาค้นหาตามชื่อจะใส่ "กติติ" คนที่มี keyword ใกล้เคียงนี้ก็จะแสดงออกมานะครับ แต่พอผมพิมพ์ "กติติ สว่างศรี" คือหว่างชื่อกับนามสกุลจะเคาะ 1 ครั้ง ก็จะแสดงคนชื่อนี้ออกมาเพียงชื่อเดียว ซึ่งก็ถูกนะครับ แต่ถ้าหากว่าระหว่างชื่อกับนามสกุล ผู้ที่ทำการค้นหาเกิดเคาะ 2-3 ครั้ง เผลอเคาะไปนะครับ มันจะถือว่าไม่เจอข้อมูลที่ค้นหานะครับ เราสามารถที่จะทำการที่จะไม่ให้นับเคาะที่เกินได้หรือป่าวครับ
ช่วยหน่อยนะครับ
Thu 26 Jan 2006 09:28:54
ช่วยดูตรงส่วนนี้ให้ผมหน่อยนะครับ #19
Dim pat
Dim myKey = request("key")
Dim tmp = Split(myKey, " ")
IF IsArray(tmp) Then
pat = tmp(0) & " " & tmp(1)
ELSE
pat = myKey
แล้วเอาตัวแปร pat ไปใช้ครับ (ดูแค่หลักการนะครับ ไม่เก่ง VB ครับ)
Thu 26 Jan 2006 12:10:42
ไม่ได้ครับติด Error ครับ หรือไม่ถ้าหากใช้ js ให้ผู้ใช้เคาะได้เพียงครั้งเดียว พอจะมีวิธีหรือป่าวครับ
RegExp.multiline = true;
var str = textField.replace(reg, " ");
ลองดูครับ ไม่แน่ใจว่าจะตรงตามต้องการหรือไม่
Fri 27 Jan 2006 00:34:01
อีกหน่อยนะครับ แล้วเวลาเราจะเรียกใช้ละครับ ยัง....งง อยู่เลยครับ รอบกวนหน่อยนะครับ
เช่นเอาไว้ Handle ข้อมูลตอน user submit ข้อมูล
<script language="javascript" type="text/javascript">
function replace_space(obj){
if(obj.q.value != ""){
var reg = /\s/g;
RegExp.multiline = true;
obj.q = obj.q.value.replace(reg, " ");
return true;
}else{
return false;
}
}
</script>
<form onsubmit="return replace_space(this)">
<input type="text" name="q"><input type="submit" value="Submit">
</form>
Fri 22 Feb 2008 14:14:41

















