|
|
|
จะเขียนโปรแกรมแตกข้อมูลอย่างนี้ยังไงคะ ใช้ sql เขียนได้ป่าวคะ |
|
|
|
|
|
|
|
ก๊อบปี้ ภายใน access อะคะ
|
|
|
|
|
Date :
2010-07-06 11:34:19 |
By :
แพร |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
คับได้ (ผมไม่เป็น access แต่วิธีการเดียวกัน)
คือสร้างตารางใหม่ ที่ id ไม่ต้องเป็น pri เพราะ มันซ้ำกัน (หรือจะทำเป็นสองตารางแยกก็ได้) รอไว้
เขียนโปรแกรมดึงแรกคอร์ดตารางแรกมา เอา inv มาตรวจโดยตรวจสอบค่า , เพื่อแยกจำนวน inv ต้นไว้ และแต่ละตัวตรวจสอบว่ามี - หรือ ไม่เพื่อ บันทึกลงในตารางใหม่
โดยเอา ค่า หลัง - มาลบค่า ต้นขีด เช่น 459001-10 จะได้ 9
เราก็บันทึกในรารางใหม่ไป 9 เร็คคอร์ด โดย loop บวกค่าต้นไปเรื่อยๆ
ถ้าไม่มีขีด ก็บันทึกค่าเดียว
ถ้ามี , ก็ลูปไปเรื่อยๆจนหมดค่า และ loop ดึงเรคคอร์ดใหม่ไปเรื่อยๆ
http://gunner.freetzi.com
087-577-0276, 054-368-378
|
|
|
|
|
Date :
2010-07-06 12:59:05 |
By :
pjgunner |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เขียนในส่วนไหนของ access หรอคะ คิวรี่ ที่ เป้นภาษา sql ใน access เขียนแล้ว run ในนี้ได้เรยปะคะ
|
|
|
|
|
Date :
2010-07-06 13:06:22 |
By :
แพร |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ป่าวคับ เขียนโปรแกรมขึ้นมาจัดการ
ผมไม่เคยเขียน access และ sql ของมัน
เพียงแต่ถ้าผมติดต่อมันด้วย php เป็น ก็คงทำได้คับ
คือเขียนโปรแกรมเข้าไปสร้างใหม่อัตโนมัติ
|
|
|
|
|
Date :
2010-07-06 13:09:40 |
By :
pjgunner |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*0* โอ้ววว จอร์จจจจ ~><~
|
|
|
|
|
Date :
2010-07-06 13:30:33 |
By :
แพร |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เขียนโปรแกรมช่วยแปลงประมาณ 30นาที - 1ชม
|
|
|
|
|
Date :
2010-07-07 08:30:53 |
By :
111 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
555
ป่าว คับ การไปเขียนให้ มันเป็น 10 ตามที่คุณว่า มันไม่ค่อย จะเป็นแนวผมเลยเท่าไหร่ เช่น
ตย.
$gap = 9+1;
$start = 459001;
for($i=0; $i < $gap; $i++){// loop 10 รอบ
odbc_exec(//insert sql with $start+$i);
}
มันก็ดูดีนะ แต่ตรรกะผมไม่ค่อยเขียนแบบนี้เท่าไหร่ เหมือนกับว่า มีการนับจำนวนแถว อยู่ด้วย เพราะไม่ชอบ มาบวกเองเท่าไหร่ อยากให้มันเป็นข้อมูลดิบ 9 ไปเลย เหมือนกับว่า ถ้า บวกไปอีก 1 จำต้องเขียนคอมเมนต์ ^^
|
|
|
|
|
Date :
2010-07-07 10:07:01 |
By :
pjgunner |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ทำได้แหละ แต่ไม่เคยใช้พวก odbc ติดต่อฐานข้อมูลเท่านั้นเอง
แต่ไม่รู้ว่า จขกท. จะเปลี่ยนไปทำไม ตารางนี้อ่ะจ๊ะ
|
|
|
|
|
Date :
2010-07-07 10:49:08 |
By :
pjgunner |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
odbc อ่ะ ใส่สูตร ทำตัวหนา ติดกราฟมะด้ายหรอกค่ะ อิอิ
ส่วนพี่แพรมั้งนะคะ น่าจะเป็นพี่เห็นถามๆเรื่องนี้นานละ
จะเปลี่ยนระบบเก่าๆ ให้ทะนสมัยไงคะ
จำมั่งปาวเนี่ยพี่เอี่ยวใครถามอะไรไป ใครตอบไรไป
ยังจำได้เลย พี่เอี่ยวไปโพสกะทู้ปัญหาชีิวิต โอดครวญรัยมะรุ
พอเราไปโพสต่อนะ มีลบกระทู้ออกไปด้วย จำได้มั่งปะคะ
|
|
|
|
|
Date :
2010-07-07 10:54:49 |
By :
blurEyes |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
จำไม่ได้อ่ะคับ TT
|
|
|
|
|
Date :
2010-07-07 10:59:31 |
By :
pjgunner |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*0*
เราลองเอาแนวคิดคุณเอี่ยวมา เขียนโปรแกรมนะคะ
Code (PHP)
while($itemrow = odbc_fetch_array($itemresult)){
$CustomInv = $itemrow["RefCustoms"];
$ExplodeInv = explode("-", $CustomInv);
$Inv_Start = trim($ExplodeInv[0]);
$Inv_End = preg_split('/[\s,]/', trim($ExplodeInv[1]));
$Inv_End = $Inv_End[0];
$Length_Inv_End = strlen($Inv_End);
$Length_Inv_Start = strlen($Inv_Start);
$Length_Back_Start = $Length_Inv_Start-$Length_Inv_End;
$Inv_Back_Start = SUBSTR($Inv_Start,$Length_Back_Start,$Length_Inv_End);
//$Inv_To_End = $Inv_End;
$Diff_InvStar_InvEnd = $Inv_To_End-$Inv_Back_Start;
echo "<br/>";
echo '$CustomInv : ' . $CustomInv . "<br/>";
echo '$Inv_Start : ' . $Inv_Start . "<br/>";
echo '$Inv_End : ' . $Inv_End . "<br/>";
echo '$Length_Inv_End : ' . $Length_Inv_End. "<br/>";
echo '$Length_Inv_Start : ' . $Length_Inv_Start. "<br/>";
echo '$Length_Back_Start : ' . $Length_Back_Start. "<br/>";
echo '$Inv_Back_Start : ' . $Inv_Back_Start . "<br/>";
echo '$Inv_To_End : ' . $Inv_To_End . "<br/>";
echo '$Diff_InvStar_InvEnd : ' . $Diff_InvStar_InvEnd . "<br/>";
echo "----------------------------------------------------------------<br/>";
for($i=$Inv_Back_Start;$i<=$Inv_End;$i++){ // ############# ตรงนี้อะคะ
/*
$inv = SUBSTR($Inv_Start,0,$Length_Back_Start).$i;
$Length_Inv = strlen($inv);
$Diff_Length_Inv_InvStart = $Length_Inv_Start-$Length_Inv;
$inv = STR_PAD($inv,$Diff_Length_Inv_InvStart,0,STR_PAD_LEFT);
*/
echo $i;
}
}
ตรง for อะคะ มันเหมือน run ช้ามากเลย จนค้างไปเลยคะเว็บบราวเซ่อนั่น
|
|
|
|
|
Date :
2010-07-07 12:55:22 |
By :
แพร |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตัวอย่างผลการรันนะคะ ถ้าไม่มี for นะคะ
$CustomInv : 4794017204-10
$Inv_Start : 4794017204
$Inv_End : 10
$Length_Inv_End : 2
$Length_Inv_Start : 10
$Length_Back_Start : 8
$Inv_Back_Start : 04
$Inv_To_End : 10
$Diff_InvStar_InvEnd : 6
ตรง for อะคะ จะเขียนเพื่อให้
เติม 0 ข้างหน้าอะคะ
อย่างกรณีข้อมูลตัวอย่าง ถ้า รอบแรก +1 ก็จะได้เป็น 479401725 รอบถัดไปบวกอีก 1 จะได้ 4940126 เราจะเติม 0 ข้างหน้าอะคะ ให้เป็น 4794017205 , 4794017206
แต่บางที ก็จะมี เป็นแบบนี้คะ
$CustomInv : 4794017399-403
$Inv_Start : 4794017399
$Inv_End : 403
$Length_Inv_End : 3
$Length_Inv_Start : 10
$Length_Back_Start : 7
$Inv_Back_Start : 399
$Inv_To_End : 403
$Diff_InvStar_InvEnd : 4
ก็เรยต้องมีการคำนวนจำนวนตัวเลขก่อน ว่ามีกี่ตัว จะได้เติม 0 ถูกนะคะ
|
|
|
|
|
Date :
2010-07-07 13:05:51 |
By :
แพร |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
?????????
|
|
|
|
|
Date :
2010-07-07 15:26:56 |
By :
pair |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมไม่รู้ว่า ตารางต้นมันมีกี่ฟีลนะ ผมเดาว่า สองฟีลตามรูป แต่อาจมีอีกเพราะเห็น $itemrow["RefCustoms"];
บอกไว้ก่อนนะครับ ถ้ามีหลายเรคคอร์ดมาก ทั้งต้นฉบับ และ ตารางใหม่ ควรเขียนให้อ่านทีละช่วงและใส่ทีละช่วงจะชัวร์กว่า (กลัวเครื่องแฮงค์)
จาก โค้ด No.17 จริงๆ ต้องแยกด้วย , ก่อน - นะครับ
บอกไว้ก่อนผมไม่เคยเขียนพวก odbc แต่อยากลองเขียนมั่วดู ^^ อย่างน้อยก็จะแสดงตรรกะให้ดู
ลักษณะตาราง มีสองฟีล id และ inv และสร้างตารางใหม่รอไว้ แต่ไม่ให้ id เป็น primary หรือ unique
เป้าหมายก็คือ ทำให้ทุก inv แยกแรคคอร์ดกัน
Code (PHP)
// ไม่จำกัดเวลาในการ execute
set_time_limit(0);
// เพิ่มหน่วยความจำ เพราะเรคคอร์ดเยอะ
ini_set('memory_limit', '150M');
// จำนวนแถวที่ถูก insert
$inserted_row = 0;
while ($row = odbc_fetch_array($itemresult))
{
$id = $row['id'];
// invoice ดิบ
$native_inv = $row['inv'];
// แยก ด้วย , (จะได้อาเรย์ ออกมา เช่น array('495001-10', '495020'))
$invs = preg_split('/[,\s]/', $native_inv);
// จัดการแต่ละ invoice หรือ ช่วง invoice
foreach ($invs as $val)
{
// ตรวจสอบว่า มีช่วง ของ inv โดย หา -
if (preg_match('/-/' $val) === 1)
{
// พบ แสดงว่ามี ช่วงของ inv ให้สร้าง ต้นฉบับ
// ดึงตัวหน้าและตัวหลัง ผมไม่เข้าใจตรงที่ว่าเติม 0 อะไรนะ ไปทำเองแล้วกัน
list($first, $end) = preg_split('/-/', $val);
// เอา ส่วนหน้าของ $first ไปไว้หน้า ของ ตัว $end เพื่อได้ค่า สุดท้ายมา
$new_end = (int) substr($first, 0, (strlen($first) - strlen($end))).$end;
$first = (int) $first;
// บันทึก ข้อมูล
while ($first <= $new_end)
{
odbc_exec($conn, "INSERT INTO new_table VALUES('$id', '$first')");
++$first;
++$inserted_row;
}
}
else
{
// ไม่พบ - (คือมี อันเดียว) ให้บันทึก
odbc_exec($conn, "INSERT INTO new_table VALUES('$id', '$val')");
++$inserted_row;
}
}
}
echo $inserted_row, 'rows inserted';
ปล. เอาไปทดสอบเอง หลักการนี้แล
|
|
|
|
|
Date :
2010-07-09 20:10:51 |
By :
pjgunner |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
comment ได้อารมมาก
พี่เอี่ยวน่าจะเปิด blog เขียน code ไปบ่นไป ได้เลยนะคะ
|
|
|
|
|
Date :
2010-07-09 20:24:29 |
By :
blurEyes |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ปรกติถ้าผมทำเองไม่เมนต์ เยอะขนานี้หรอกคับ คิดว่าแค่สองสามอัน
กลัวเค้าไม่เข้าจายจ๊ะ (วัยรุ่นไปป่าวเนี่ย)
|
|
|
|
|
Date :
2010-07-09 20:32:37 |
By :
pjgunner |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 01
|