الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تنبيه ] كيف يتم استبدال قيمة عمودين مختلفين بالنوع

مُجاب
بدأه jmjms في 26 فبراير 2013 · 23 رد · 2,057 مشاهدة · في قواعد بيانات Visual FoxPro
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم


ماهية طريقة استبدال قيمة عمود في جدول نوعة حرفي اي character


على عمود ثاني نوعة رقمي اي numeric


علما ان قيمة العمودين هي ارقام فقط 


تم تعديل هذه المشاركة بواسطة lion iraq في 26 فبراير 2013 في 23:55 — السبب: الاخ العزيز تم تغيير العنوان : وارجو عدم استخدام اللهجة الشعبية

#2 أفضل إجابة

السلام عليكم

اخي العزيز هنالك الكثير من الطرق ولكن لدلك على داله جديدة سهلة ويمكن استخدامها من replace  وهي  CAST( ) Function

والضيغة البرمجية

CAST(eExpression AS cDataType [(nFieldWidth [, nPrecision])]
   [NULL | NOT NULL])

 

ومهمتها تحويل نوع الحقل الى نوع حسب الطلب n  او c

لنفترض ان هنالك جدولين الاول باسم lion  ويحتوي على حقل code  نصي

والاخر جدول باسم lion1  ويحتوي على حقل code  رقمي

 

ولنفترض اردنا استبدال صف من جدول lion  بصف معين ضمن نفس الحقل من جدول lion1 اليك الايعاز

REPLACE code WITH CAST(lion1.code as C)
 وبالعكس اذا اردنا 
REPLACE code WITH CAST(lion.code as N)

لاحظ كيفية تغيير النوع عند الاضافة مع العلم الحقل لايتاثر بالنوع

تحياتي للجميع



*- يحظر استخدام اللهجة العامية*- أو كتابة الأسئلة باللغة الإنجليزية*- أو كتابة الكلمات الإنجليزية بالعربية====

تم تعديل هذه المشاركة بواسطة lion iraq في 26 فبراير 2013 في 23:54 — السبب: الاخ العزيز تم تغيير العنوان : وارجو عدم استخدام اللهجة الشعبية

#3
اقتباس

لاحظ كيفية تغيير النوع عند الاضافة مع العلم الحقل لايتاثر بالنوع

تحياتي للجميع

 

 

 

 

شكرا لك اخي العزيز فراس على سرعة الاجابة 

ولكن اخي تظهر هذه الرسالة عند التنفيذ

97427993.jpg

وهي

عدم تطابق نوع البيانات

 

المطلوب هو

اذا كانت الحقل يحتوي على معلومات وليس فارغ

هو نقل قيمة حقل  نوع (C)الى حقل نوع (N) سواء كان الحقلان في جدول واحد او اثنان دون  التأثير بالقيمة 

مثلا نقل قيمة 44.50 او قيمة عشرية

 

ملاحظة

عند تغيير نوع الحقل من (C) الى (N) من خصائص الجدول وكان يحتوي الحقل الاول على نفس القيمة اعلاه وهي 44.50

عند التغيير تتحول القيمة الى 44.00

اي اذا كانت القيمة عبارة عن رقم ثم فاصلة ثم رقم عند تحويل نوع الحقل يتغيير ما بعد الفاصلة الى( اصفار)

والمطلوب هو ان تبقى على حالها دون تغيير القيمة

 

واذا لم يكن حل لهذه المشكلة 

هل يوجد كود لحذف الفاصلة فقط من القيمة لان القيمة الصحيحة اي بدون فاصلة تنقل كما هي بدون التغيير

 

واسف على الاطالة

تم تعديل هذه المشاركة بواسطة jmjms في 27 فبراير 2013 في 09:35

#4

اخي العزيز

لاتاسف على اي شي وانا اشجع الشرح المفصل

ارفق جدول او جدولين للتطبيق

وسوف اريك طريق الاستعمال مع ذكر نسخة الفيجوال فوكس برو

تحياتي

#5

اخي العزيز فراس تم حل المشكلة 

ولكن سوف اضع ماهي الاخطاء التي صادفتني للافادة

 

بالنسبة للرسالة الاولى كان الكود بالشكل الاتي

 

SELECT porta
( REPLACE jm WITH CAST(porta2.jm AS n
 
والصحيح
 
SELECT port2
( REPLACE jm WITH CAST(porta.jm AS n
 
 
اما مشكلة الارقام العشرية 
33645574.jpg
 
يجب ان يكون هنا عدد بقدر الارقام التي بعد الفاصلة
 
وشكرا على الجهد المبذول
 
 
وطلب اخير هو كود لحذف الفاصلة بدون الارقام في الحقل 

lion iraq.rar

تم تعديل هذه المشاركة بواسطة jmjms في 27 فبراير 2013 في 10:39

#6

الاخ العزيز

يجب مراعاة الاتي

طلبت ختلاف في النوع

والمثال يوجد اختلاف في النوع والطول

وسوف ارشدك الى تطبيقها وبنفس الدالة

في مثالك الكود

SELECT porta2
 REPLACE jm WITH CAST(porta.jm AS n)
 BROWSE 
 يمكنك ومن خلال الصيغة البرمجية اضافة الطول والفاصلة مع الرقمية ووليصبح الايعاز هو 
SELECT porta2
 REPLACE jm WITH CAST(porta.jm AS n(9,2))
 BROWSE 
 مع الانتباه الى طول الحقل او القيم يجب ان تكون بنفس الطول 
واذا كنت تريد العكس اي من حقل رقمي الى نصي لاحظ الايعاز
SELECT porta
 REPLACE jm WITH CAST(porta2.jm AS C(10))
الحقل الرقمي كان طوله 9 
والدالة عملة له 10
لغرض اضافة الفاصلة 
اي قم باضافة الطول  زائد واحد اذا كنت تريد الحفاظ على الفواصل 
تحياتي لك وللجميع 
وانا مستمر معك في المتابعة
#7

اخي فراس يرجى توضيح طريقة استبدال الحقل بالكامل  علما ان القيمة لكل صف مختلفة عن الاخرى


وطريقة اعلاه يتم فيها استبدال الصف الاول فقط من الحقل


 


15492769.jpg


تم تعديل هذه المشاركة بواسطة jmjms في 27 فبراير 2013 في 18:35

#8
هذا الكود يتطلب تساوي الصفوف بين الجدولين او الحقول وهو مبسط 

DO WHILE !EOF()

SELECT porta

ccode=jm

SELECT porta2

REPLACE jm WITH CAST(ccode as n)

skip

SELECT porta

skip

ENDDO

وتاكد الايعازات لها سياقات وشروط للعمل 

وبالامكان استخدام الاستعلام ومن ثم تصدير لجدول باسم معين

اما الارقام ذات الفواصل الثنائية مثلا 12.22.23

او نقاط العرض والطول يجب ان تكون نوع نص لتفادي المشاكل 

وبالامكان ادخالها منفرد وتستخرج بشكل واحد

تحياتي للجميع
#9

islams125.gif


 


 


شكرا لك اخي العزيز فراس على المتابعة والابداع


 


 


 


cf888e13d2vc0.gif


هذا النسر سوف ياكل طيورك

#10

الشكر لله

اخي العزي لك ولجميع الاعضاء الاخوة ارجو عدم التردد في حال وجود اي مشكلة

ان يشاركناً معه

تحياتي للجميع

#11

طيب يا حبايب هناك شيء اخر وهو اذا اردت ان انقل بيانات حقل من جدول وليكن اسم الجدول الاول lion1 واسم الحقل raw والبيانات في الحقل رقمي الى جدول اخر باسم lion2 واسم الحقل ايضا raw والنقل يكون بالاعتماد على رقم الموظف بحيث يبحث ان وجد رقم الموظف في الجدول الثاني الذي هو اصلا موجود في الجدول الاول يضيف القيد والا لا يضيف ؟ من يستطيع الاجابة اكون له شاكراً ؟

#12

السلام عليكم

اتمنى من الاخوة الكرام المحاوله مع العلم ثلثي الاجابه موجدة بالموضوع امهلكم ليومين مع صاحب الموضوع طبعاًاتمنى المحاوله قبل اجابتي

تحياتي

#13
انا حاولت ولا ادري ان كانت محاولتي صحيحة أم خاطئة مع قلة بضاعتي في الفجوال فوكس الا انني اريد ان اتعلم ارجو الافادة ؟؟

 

DO WHILE !EOF()

SELECT lion2

raw=raw1

SELECT lion1

seek sno

"sno رقم الموظف

if found 

REPLACE raw1 WITH CAST(raw as n)

skip

else thisform.realse

endif

ENDDO

تم تعديل هذه المشاركة بواسطة كمال العراقي في 3 مايو 2014 في 00:34

#14

الاخوة الاعزاء برجاء مراجعة المثال المرفق

lion.rar

Persistent Fox

#16

شكرا على المساعدة وبوركتم

#17

اخي العزيز الاخ المثابر فكرة جميله جداً 

واليك بنفس طريقه الاخ المثابر مع القليل من الاختصار 

SELECT lion1
GO top
DO WHILE !EOF()
icode=E_code
SELECT lion2
scan FOR E_code=icode
replace raw WITH lion1.raw
ENDSCAN  
GO TOP 
SELECT lion1
SKIP
ENDDO 
MESSAGEBOX("done")
#18

شكرا لك اخي العزيز . فعلا طريقة حضرتك تختصر كثيرا في الكود دائما ما نتعلم منك ونستفيد من خبرتك.

ولكن عندي سؤال هام دائما ما اسئلة ولا اجد لة اجابة علي الرغم من معرفتي بأمر scan -endscan ولقد اسخدمتة كثيرا من قبل ولكني لم اسخدمة في المثال الذي قمت بمشراكتة واستخدمت بدلا منة الامر locate و if -endif دائما ما اكتشف هذة المشكلة بعد الانتهاء من تنفيذ اي برنامجي اني كتبت الكثير من الاكواد لعمل شيء معين علي الرغم من انة كان يمكن حلة بطريقة ابسط وعدد اقل من السطور هل هيا قلة خبرة ؟

Persistent Fox

#19

هذا لايعتبر قلة خبرة وانما طريقه لفكره

وعند استيعاب ادوات ودوال البرمجة يمكنك اختيار الطريقه المناسبه وهذا يعتمد على الخبرة

اما اذا لم تعرف طريقه عمل الايعازات او الادوات فهذا يعتمد على الخبرة

والفكرة اعلاه يمكن عملها بااكثر من طريقه واكثرها شيوعاً طريقتي وطريقتك ويمكن عملها ب for

لانها تعتمد على loop

داخل الجداول

استمر في عمل كل فكرة بااكثر من طريقه بعد استيعاب الفكرة والناتج منها وان ارى فيك خبير مذهل في البرمجة

والفارق بين الخبير والمبرمج ان الخبير يستطيع انشاء الفكرة باكثر من المبرمج في عدد الطرق

تحياتي

#20

السلام عليكم

طبعا لا مشكلة باستخدام Scan أو For أو Do while

 

ولكن باستخدام Sql Update يختلف الوضع بشكل كبير من ناحية السرعة خاصة لو تكلمنا عن آلاف السجلات

هذا بالاضافة لاختصار الكود بجملة واحدة وهي على سبيل المثال

UPDATE B_Table SET Salary=A_Table.Salary FROM A_Table WHERE B_Table.EmpId =A_Table.EmpId

جرب المثالين التاليين وانظر لفرق السرعة الذي سيظهر على الشاشة

مثال SQL UPDATE

*SQL UPDATE
CLOSE DATABASES ALL
CREATE CURSOR A_Table (EmpId i, EmpName c(30) , Salary N(20,3))
FOR i = 1 TO 100000
	INSERT INTO A_Table VALUES(i, "EmpName "+TRANSFORM(i), i*753)
ENDFOR
INDEX ON EmpId TAG EmpId
CREATE CURSOR B_Table (EmpId i, EmpName c(30) , Salary N(20,3))
FOR i = 1 TO 3000
	INSERT INTO B_Table VALUES(i, "EmpName "+TRANSFORM(i), 0)
ENDFOR
INDEX ON EmpId TAG EmpId
a=SECONDS()
UPDATE B_Table SET Salary=A_Table.Salary FROM A_Table WHERE B_Table.EmpId =A_Table.EmpId
?SECONDS()-a
RETURN

والتالي نفس المثال مع تطبيق Do While

CLOSE DATABASES ALL
CREATE CURSOR A_Table (EmpId i, EmpName c(30) , Salary N(20,3))
FOR i = 1 TO 100000
	INSERT INTO A_Table VALUES(i, "EmpName "+TRANSFORM(i), i*753)
ENDFOR
INDEX ON EmpId TAG EmpId
CREATE CURSOR B_Table (EmpId i, EmpName c(30) , Salary N(20,3))
FOR i = 1 TO 3000
	INSERT INTO B_Table VALUES(i, "EmpName "+TRANSFORM(i), 0)
ENDFOR
INDEX ON EmpId TAG EmpId

SELECT A_Table
GO TOP
a=SECONDS()
DO WHILE !EOF()
	icode=EmpId
	SELECT B_Table
	SCAN FOR EmpId =icode
		REPLACE Salary WITH A_Table.Salary
	ENDSCAN
	GO TOP
	SELECT A_Table
	SKIP
ENDDO
?SECONDS()-a

أستغفر الله العظيم و أتوب إليه

#22

تسلم عزيزي....المهم كيف ظهرت النتائج لديك ؟

أستغفر الله العظيم و أتوب إليه

#23

اذا كان السوال لي فانا لا ادقق خلفك لثقتي العمياء بك انك كدها في البرمجة والعمل جميل جداً ولايحتاج التنفيذ فقط من قراءة الايعاز شي حلو بارك الله فيك واتمنى ان تتابع المنتدى خلال هذا الشهر لضرف خاص بالامتحانات النهائية 

وستكون متابعتي شبة منعدمة وتحياتي للجميع

#24

العفو عزيزي فراس وموفق بالامتحانات ان شاء الله

وان شاء الله اتابع ما أمكن ( حسب الظروف والوقت )

 

 

بالتوفيق :)

أستغفر الله العظيم و أتوب إليه

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…