PDA

View Full Version : انتقال داده



omidsistani
چهارشنبه 20 شهریور 1392, 15:01 عصر
با سلام خدمت همه دوستان عزیزم
یه پروژه کار میکنم که دیتا بیسم اکسسه
یه جدول دارم که لیست کالاها و قیمت مصرف کننده و چند تا قیمت دیگه و ... رو داره و نزدیک 5000 تا رکورد هم داره
حالا یه وقتایی از شرکت اصلی یه فایل اکسس دیگه ایمیل میشه که آخرین تغییر قیمتا تو اونه.
حالا من میخوام اون جدولو با جدول خودم مقایسه کنم و هر فیلدی که مغایرت داشت اتومات اصلاح شه و اگه فیلدی تو جدول شرکت بود و تو جدول من نبود به جدول من اضافه شه.
فیلدای جدول خودمو که میخوام تغییر کنن دقیقا هم نام و هم نوع جدول شرکت تعریف کردم.
خودم تو فکرمه که با یه حلقه اینو بنویسم اما قبلش خواستم با دوستان یه مشورتی داشته باشم تا ببینم راه سریعتری برای اینکار پیشنهاد میدن یا خیر.
خیلی ممنون میشم که راه حلی بلدین اینجا مطرح کنید.
با تشکر از دوستان همیشه در صحنه برنامه نویس!!!

یوسف زالی
چهارشنبه 20 شهریور 1392, 16:04 عصر
سلام.
اگر دنبال راه سریع تر هستید، سریع ترین راه استفاده از خود امکانات اکسسه.
باید یک کوئری ران کنید در اکسس.
اما با استفاده از یک کوئری در دلفی هم می تونید با فقط یک اجرا، تمام داده هاتون رو به روز کنید.

omidsistani
چهارشنبه 20 شهریور 1392, 16:20 عصر
باز هم مثل همیشه فقط you see عزیز جواب دادن
دوست عزیزم این راهکار تو ذهنمه:
دو تا جدولو به ترتیب فیلد کلید مرتب میکنم
از جدول شرکت شروع میکنم اگه فیلد کلید تو جدول من موجود بود متغیرای جدول منم ادیت بشه و اگه تو جدول من وجود نداشت عینا درج بشه
بعد هر دو تا جدول یکی برن جلو تا برسن به رکورد بعدی و همینطور تا آخر جدول
**********
به نظرتون این راه حل خوبه؟
این راه حل زیاد طول نمیکشه؟

یوسف زالی
چهارشنبه 20 شهریور 1392, 16:26 عصر
چرا دیگه، گفتم که.
فرض کنیم ساختار جداول شما این جوری باشه:
T1GoodCode و T1Price
این مشخصات رو در جدول T1 دارید.

حالا یک فایل دیگه میاد که اسم جدولش رو می ذاریم T2 و ساختارش رو هم دقیقا مثل قبل در نظر می گیریم،

آپدیتتون این می شه:


Update T1
set T1Price = T2Price
from T2
where T1GoodCode = T2GoodCode and T1Price <> T2Price


البته نمی دونم اکسس تا چه حد با Update - from منطبقه، اگر نیست، با یک ساب کوئری هم می شه نوشتش.

یوسف زالی
چهارشنبه 20 شهریور 1392, 16:30 عصر
راستی یادم رفت، قسمت درج رو هم اضافه کنید :چشمک:

omidsistani
چهارشنبه 20 شهریور 1392, 16:41 عصر
آره احتمالا همین درسته مهندس
دستت طلا
امتحان میکنم و بهت خبر میدم که نتیجه چی شد

omidsistani
چهارشنبه 20 شهریور 1392, 20:22 عصر
راستی.
.اولا من پایگام اکسسه ها!!! میتونم از کدای اس کیو ال استفاده کنم یا باید از دستورات دلفی استفاده کنم؟؟؟
دوما: میشه من پایگامو بذارم اس کیو ال بعد از این روش استفاده کنم یعنی فایل شرکت همون اکسس اما از من اس کیو ال
:متفکر:

یوسف زالی
چهارشنبه 20 شهریور 1392, 21:06 عصر
جواب هر دو سوال بله می باشد!

omidsistani
جمعه 22 شهریور 1392, 11:56 صبح
ببخشید که اینقد سوال میکنم ها
الان من با 2 تا دیتا بیس درگیرم دیگه؟ درسته؟
یکی دیتا بیس خودم و یکی هم دیتا بیسی که شرکت میفرسته
من اول باید یه جدول تو دیتا بیس خودم بذارم شبیه جدولی که میخوام از دیتا بیس شرکت بردارم، بعدش هر بار که فایل جدید رسید جدول خودم خالی کنم و از نو با جدول شرکت پر کنم
بعد از این انتقال میتونم برم کوئری بنویسم و جدولی که توش قیمتا نیاز به تغییر داره رو تغییر بدم،
امیدوارم متوجه شده باشی چی گفتم مهندس جان
الانم یه کد نوشتم که فک کنم درست کار نمیکنه که البته با کوئری نیست:

dform.drugdata_tbl.Sort:='persiandrugname ASC';
dform.newdrugs_tbl.Sort:='persiandrugname ASC';
dform.drugdata_tbl.First;
dform.newdrugs_tbl.first;
progress_tool.Max:=dform.newdrugs_tbl.RecordCount;
while not dform.newdrugs_tbl.Eof do
begin
if dform.newdrugs_tbl['persiandrugname']=dform.drugdata_tbl['persiandrugname'] then
begin
dform.drugdata_tbl.edit;
dform.drugdata_tbl['LastPrice']:= dform.newdrugs_tbl['LastPrice'];
dform.drugdata_tbl['LastPriceDate']:= dform.newdrugs_tbl['LastPriceDate'];
dform.drugdata_tbl['KhadamatPrice']:=dform.newdrugs_tbl['KhadamatPrice'];
dform.drugdata_tbl['TaminPrice']:= dform.newdrugs_tbl['TaminPrice'];
dform.drugdata_tbl['ArteshPrice']:= dform.newdrugs_tbl['ArteshPrice'];
dform.drugdata_tbl.Post;
dform.drugdata_tbl.Next;
end
else
begin
dform.drugdata_tbl.insert;
dform.drugdata_tbl['persiandrugname']:=dform.newdrugs_tbl['persiandrugname'];
dform.drugdata_tbl['englishdrugname']:=dform.newdrugs_tbl['englishdrugname'];
dform.drugdata_tbl['irc']:=dform.newdrugs_tbl['irc'];
dform.drugdata_tbl['fivedigitcode']:=dform.newdrugs_tbl['fivedigitcode'];
dform.drugdata_tbl['drugformcode']:=dform.newdrugs_tbl['drugformcode'];
dform.drugdata_tbl['pcode']:=dform.newdrugs_tbl['pcode'];
dform.drugdata_tbl['count']:=0;
dform.drugdata_tbl['LastPrice']:= dform.newdrugs_tbl['LastPrice'];
dform.drugdata_tbl['LastPriceDate']:= dform.newdrugs_tbl['LastPriceDate'];
dform.drugdata_tbl['KhadamatPrice']:=dform.newdrugs_tbl['KhadamatPrice'];
dform.drugdata_tbl['TaminPrice']:= dform.newdrugs_tbl['TaminPrice'];
dform.drugdata_tbl['ArteshPrice']:= dform.newdrugs_tbl['ArteshPrice'];
dform.drugdata_tbl.Post;
end;

progress_tool.Position:= progress_tool.Position+1;
dform.newdrugs_tbl.Next;
end;
کد بالا بدن خطا اجرا میشه ولی فک کنم وقتی که رکوردای دو تا جدول یکی نباشه درست جواب نده!یعنی همه فیلدا رو چک نمیکنه
drugdata جدول خودمه و newdrug جدول شرکت. یعنی اسمش تو دیتا بیس یه چیز دیگست،اسم adotableای که بهش وصل کرم اینه

hp1361
جمعه 22 شهریور 1392, 14:02 عصر
سلام

به نظر من اگه با دستورات SQL کار کنی کدت خواناتر خواهد بود و کارت هم راحت تره و تسلط بیشتری هم بکاری که داری انجام میدی داری!

از Query استفاده کن

omidsistani
جمعه 22 شهریور 1392, 15:04 عصر
hp عزیز منم میخواستم از کوئری استفاده کنم اما چون دو تا دیتا بیس جدا بود نتونستم و این فکر به ذهنم اومد که اول اون جدول رو از اون دیتا بیس به دیتا بیس خودم انتقال بدم بعد با یک کوئری قیمتا رو تغییر بدم
کدی که بالا نوشتم چیزی نیست که اینجا گفتم، اینو قبلا نوشتم که نظرم مشکل داره
باید چیزی رو که اینجا گفتم پیاده سازی کنم ببینم چی میشه
ممنون دوست عزیز

omidsistani
یک شنبه 24 شهریور 1392, 08:51 صبح
هم خودم هنگ کرم هم برنامه!!!!!
آقا میشه تو یک adoquery مقادیر دو جدول از دو بانک متفاوت رو ویرایش کرد؟
با اجازه من یه توضیح کلی تر از برنامه میدم،دوسانی که میتونن یه کمکی کنن:
پایگاه داده ها اکسسه و برنامه هم دلفی 7
یه فایل اکسس از اینترنت دانلود میشه و تو این فایل یک جدول هست که اسم کالاها و آخرین قیمت ها (هر کالا 4 قیمت داره) موجوده!
حالا منم تو دیتابیسم یه جدول دارم که حاوی نام کالاها و قیمت ها و مجودی و بارکد و ... است.
فیلد کلید تو هر دوتا جدول نام کالاست!
برای اتصال به دو تا فایل اکسس از دو تا adoconection استفاده کردم و برای جدول ها هم adotable , dataaccess
مشکل من اینجاست که یه دکمه گذاشتم به عنوان بروزرسانی، میخوام وقتی رو این دکمه کلیک میشه اطلاعات جدوال با هم مقایسه شه و قیمت ها تغییر کنه، یعنی اگه فیلدی تو جدول شرکت بود و تو جدول منم بود فقط قیمت ها رو تغییر بده و اگه تو جدول شرکت بود و تو جدول من نبود، رکورد شرکت عینا تو جدول من ثبت شه و بقیه فیلدها هم با مقدار پیشفرض پر شه!
اسم فیلد های مشترک بین دو جدول دقیقا یکی می باشد.
با adoquery خواستم پیاده سازی کنم نفهمیدم چیکار کنم و برنامه هنگ کرد!!!!
با دستورات خود دلفی کلی کد نوشتم ولی نتیجه نگرفتم
اگه میشه یه راهنمای کوچیک بهم کنید خیلی ممنون میشم!
دستتون طلا

hp1361
یک شنبه 24 شهریور 1392, 10:07 صبح
سلام

راه ساده :

هر یک از ADOConnection ها رو به بانک مربوطه وصل کن.
2 تا کوئری به هر یک از بانک ها وصل کن
رکورد به رکورد مقایسه کن .(یعنی برای هر یک از رکورد های بانک اول، یکبار از بانک دوم Select بگیر اگه نتیجه خالی بود Insert کن و اگر رکورد تکراری بود Update کن!)

البته برای اینکه فرایند طولانی نباشه، اگه بانکی که دریافت میکنی و قراره بانک خودت رو باهاش تطبیق بدی صرفا دارای رکورد های تغییر کرده و یا جدید باشه زمان کمتری خواهد برد.

موفق باشیم

omidsistani
یک شنبه 24 شهریور 1392, 12:22 عصر
ممنون hp عزیز
فایلی که از اینترنت دانلود میشه حاوی همه رکورداست!
دو تا adoconnection گذاشتم و به دو تابانک وصله! رکوردای دو تا هم تو دو تا ADOTABLE میبینم.
من مشکلم تو نوشتن کده hp جان! حالا دوباره امتحان میکنم ببینم چیکار میتونم بکنم
ممنون

یوسف زالی
یک شنبه 24 شهریور 1392, 12:23 عصر
گفتمت که،
فایل ها رو در یک دیتابیس وارد کن، و از اسکریپت استفاده کن.
بدون حلقه.

omidsistani
یک شنبه 24 شهریور 1392, 12:30 عصر
بابا بلد نیستم!!!!!!:گریه:
به چه زبونی بگم!!!!!
گیچ شدم!

omidsistani
یک شنبه 24 شهریور 1392, 14:18 عصر
برا اوردنشون تو یک دیتا بیس:
تو دیتا بیس خودم یک جدول به اسم Temp درست کردم. هر وقت فایل جدید قیمت ها اومد کاربر اونو جای مورد نظر کپی میکنه بعد از داخل نرم افزار دکمه انتقال رو میزنه! اول تمام رکوردای Temp پاک میشه بعد اطلاعات جدول جدید از اول تا آخر توی temp درج میشه!
خب این حله!الان اطلاعات جدید هم توی دیتا بیس خودمه فقط مونده تغییر قیمت ها و درج رکوردای جدید!
چه کنم بزرگواران!!!!؟؟

hp1361
یک شنبه 24 شهریور 1392, 15:09 عصر
سلام

راه حلی که من ارائه دادم برای زمانی بود که از دو نوع دیتابیس متفاوت استفاده می کنید.

حالا که هردو دیتابیست از یک نوعه خوب همین روشی که انتخاب کردی خوبه.

اطلاعات رو بریز توی جدول Temp(که ریختی). حالا باید بری سراغ دستورات SQL. اگه اشتباه نکنم باید از Join استفاده کنید.

بگردی توی نت توضیح زیاد داده

omidsistani
یک شنبه 24 شهریور 1392, 16:05 عصر
join?
فک میکردم با آپدیت حل شه hp جان.
که البته فک کنم هم update و هم join

یوسف زالی
یک شنبه 24 شهریور 1392, 16:58 عصر
ترکیب Update و Join همون دستوری می شه که دادم.
Update - From

omidsistani
یک شنبه 24 شهریور 1392, 17:12 عصر
you see عزیز
اسم جدول من drugsdata و اسم جدول موفت tmpdrug
اسم فیلد کلید persiandrugname
فیلدهایی که باید چک بشه و تغییر کنه: lastprice,lastpricedate,taminprice,khadamatprice,a rteshprice
حالا دوست عزیز من نمیتونم کدشو در بیارم اگه لطف کنی ممنونت میشم

یوسف زالی
یک شنبه 24 شهریور 1392, 17:23 عصر
من نمی خواستم کد بدم تا کمی درگیر مساله بشید.
این نمونه کد اس کیو الی، ممکنه برای اکسس کار نکنه که با کمی تغییر درست می شه:


Update drugsdata
set
lastprice = A.lastprice,
lastpricedate = A.lastpricedate,
taminprice = A.taminprice,
khadamatprice = A.khadamatprice,
arteshprice = A.arteshprice
from tmpdrug A
where drugsdata.persiandrugname = A.persiandrugname
and (
drugsdata.lastprice <> A.lastprice
or
drugsdata.lastpricedate <> A.lastpricedate
or
drugsdata.taminprice <> A.taminprice
or
drugsdata.khadamatprice <> A.khadamatprice
or
drugsdata.arteshprice <> A.arteshprice
)


در ضمن، کلید روی داده ی رشته ای؟؟؟؟

omidsistani
یک شنبه 24 شهریور 1392, 17:36 عصر
YOU SEE عزیز
من این کد رو نوشته بودم ولی خطا میداد


Update drugsdata
set
lastprice = lastprice,
lastpricedate = lastpricedate,
taminprice = taminprice,
khadamatprice = khadamatprice,
arteshprice = arteshprice
from tmpdrug

where persiandrugname = persiandrugname





منظورتون از a همون جدول TMPDRUG دیگه؟
رکوردای جدید چطوری ثبت مبیشن مهندس؟یعنی اگه رکوردی از جدول جدید تو جدول من نبود چجوری تو جدول من ثبت میشه؟

omidsistani
یک شنبه 24 شهریور 1392, 17:55 عصر
قضیه a رو فهمیدم داداش
چون تو جدولی که دانلود میشه این فیلد کلیده، منم فیلد خودمو کلید گذاشتم داداش

یوسف زالی
یک شنبه 24 شهریور 1392, 21:20 عصر
اون A کار Alias رو انجام می ده. وقتی اسم فیلد رو میارید بتونه تشخیص بده فیلد تکراری برای کدوم جدوله.

omidsistani
دوشنبه 25 شهریور 1392, 07:43 صبح
ببخشید که اینقد سوال میکنم دوستان
من توی onfetchprogress مربوط به adoquery نوشتم که یه واحد به position نوار پیشرفتم اضافه شه!اما نمیشه!
چه کنم به نظرتون!!!!؟؟؟

omidsistani
دوشنبه 25 شهریور 1392, 07:45 صبح
بعد این همه کد رو تو یه خط تو adoquery بنویسم؟ نمیشه جایی باشه که دستورات رو بنویسیم و adoquery رو ارجاع بدیم به اون؟