PDA

View Full Version : سوال: پر کردن یک table access با داده های سایر table ها



disiba
شنبه 15 تیر 1392, 22:05 عصر
سلام
من یک بانک اکسس دارم که از طریق ado به برنامه ام وصل کردم . این بانک شامل 5 جدول است که یکی خالیه . می خوام از سایر جداول داده هایی رو که از listbox انتخاب میکنم رو در جدول پنجم بریزم . برای این کار چه راهی رو پیشنهاد می کنید ؟ ممنون

یوسف زالی
یک شنبه 16 تیر 1392, 13:16 عصر
سلام.
اگر اصرار به استفاده از UI دارید می تونید از همون شی اتصال به جداول با یک حلقه همین کار رو انجام بدید.

disiba
یک شنبه 16 تیر 1392, 18:30 عصر
سلام.
اگر اصرار به استفاده از UI دارید می تونید از همون شی اتصال به جداول با یک حلقه همین کار رو انجام بدید.

سلام
من توی دلفی تازه کارم . اصراری به استفاده از روش خاصی ندارم . اگه ممکنه بیشتر توضیح بدید . ممنون

یوسف زالی
یک شنبه 16 تیر 1392, 20:10 عصر
برای این کار می تونید در همون محیط اکسس یا SQL با نوشتن یک کوئری به هدفتون برسید.
ولی راه ساده ترش اینه که در دلفی با دستوراتی که در حلقه می نویسید داده هاتون رو بریزید.
ببینید:


ADO1.first;
while not ADO1.eof do
begin
.
.
.
.
ADO1.next;
end


دستور بالا کد جنرال برای پیمایش تمام ردیف های یک جدوله، شما می تونید با حلقه ای شبیه به بالا، داده هاتون رو انتخاب کرده و با نوشتن دستور اینسرت هر بار یک ردیف رو انتقال بدید.

اگر ساختار جداولتون رو می گذاشتید احتمالا می شد بدون حلقه هم با ران کردن یک کامند به همین نتیجه رسید.

gholami146
یک شنبه 16 تیر 1392, 20:18 عصر
بهترین راه برای این کار استفاده از دستورات اس کیو ال هست
با دستور اینسرت اینتو و ترکیب اون با سلکت و اگر شرطی هم دارید میتونید در اون اختصاص بدید
موفق باشید

disiba
یک شنبه 16 تیر 1392, 20:32 عصر
برای این کار می تونید در همون محیط اکسس یا SQL با نوشتن یک کوئری به هدفتون برسید.
ولی راه ساده ترش اینه که در دلفی با دستوراتی که در حلقه می نویسید داده هاتون رو بریزید.
ببینید:


ADO1.first;
while not ADO1.eof do
begin
.
.
.
.
ADO1.next;
end


دستور بالا کد جنرال برای پیمایش تمام ردیف های یک جدوله، شما می تونید با حلقه ای شبیه به بالا، داده هاتون رو انتخاب کرده و با نوشتن دستور اینسرت هر بار یک ردیف رو انتقال بدید.

اگر ساختار جداولتون رو می گذاشتید احتمالا می شد بدون حلقه هم با ران کردن یک کامند به همین نتیجه رسید.

سلام
ممنون که جواب دادید . من 3 جدول دارم که یکی شامل سال ( tab1 - year ) دومی شامل ماه ( tab2 - month ) و سومی شامل سال، ماه و نام است . از طریق 2 listbox من تعدادی سال و ماه رو انتخاب می کنم و اونا رو در listbox های جداگانه می ریزم . میخوام هنگام اجرای برنامه تعدادی سال و ماه رو انتخاب کنم و از جدول سوم رکورد هایی که این داده رو دارند انتخاب کنم و در یک جدول جداگانه بریزم . در جدول سوم فیلد ماه و سال می توانند داده های تکراری داشته باشند . اگه بشه با یک کامند به این نتیجه رسید ممنون میشم که منو راهنمایی کنید . با تشکر

یوسف زالی
یک شنبه 16 تیر 1392, 20:39 عصر
درست متوجه نشدم.
ببینید منظورتون این بود؟

جدول 1
---------
کد - سال

جدول 2
--------
کد - ماه

جدول 3
---------
کد - سال - ماه - نام

اگر این طوره که طراحی تون مشکل داره.
باید این طور باشه:

جدول 3
--------
کد - کد جدول 1 - کد جدول 2 - نام

از طرفی من متوجه نمی شم، بالاخره چند تا جدول دارید؟ 5 تا یا 3 تا؟
و کاری که می خواهید کنید چیه؟
و چرا با لیست باکس دارید کار می کنید؟

اما به هر حال اگر برداشت های من از مساله شما درست باشه، باید با نوشتن یک حلقه که آیتم های لیست نهایی رو پیمایش می کنه بیایید و در هر بار اجرای لوپ، یک ردیف به جدول خروجی اینسرت کنید.

بهتره تصویری از جداول و خروجی مورد نظرتون رو بگذارید و توضیحات کافی هم در مورد روش و چرایی کارتون بگید تا بشه بهتر راهنمایی کرد.

disiba
یک شنبه 16 تیر 1392, 20:55 عصر
درست متوجه نشدم.
ببینید منظورتون این بود؟

جدول 1
---------
کد - سال

جدول 2
--------
کد - ماه

جدول 3
---------
کد - سال - ماه - نام

اگر این طوره که طراحی تون مشکل داره.
باید این طور باشه:

جدول 3
--------
کد - کد جدول 1 - کد جدول 2 - نام

از طرفی من متوجه نمی شم، بالاخره چند تا جدول دارید؟ 5 تا یا 3 تا؟
و کاری که می خواهید کنید چیه؟
و چرا با لیست باکس دارید کار می کنید؟

اما به هر حال اگر برداشت های من از مساله شما درست باشه، باید با نوشتن یک حلقه که آیتم های لیست نهایی رو پیمایش می کنه بیایید و در هر بار اجرای لوپ، یک ردیف به جدول خروجی اینسرت کنید.

بهتره تصویری از جداول و خروجی مورد نظرتون رو بگذارید و توضیحات کافی هم در مورد روش و چرایی کارتون بگید تا بشه بهتر راهنمایی کرد.


بانک من کلا 4 جدول داره به شرح زیر

جدول 1 ( tab1 ) :
کد ( id )
سال ( year )

جدول 2 ( tab2 )
کد (id )
ماه ( month )

جدول 3 (tab3 ) : در این جدول میتوانیم رکوردهایی رو که سال و ماه اونا برابرند داشته باشیم ( یونیک نیستند )
کد (id)
سال ( year )
ماه ( month )
نام ( name)

جدول 4 ( tab4 )
ساختار این جدول شبیه جدول 3 است ولی در ابتدا خالی است

از اولین لیست باکس تعدادی سال رو انتخاب می کنم و در یک لیست باکس دیگه میریزم . شبیه همین کار رو برای ماه انجام میدم . می خوام از جدول 3 رکوردهایی که سال و ماه اونا برابر سالها و ماههای انتخاب شده هستند رو در جدول 4 کپی کنم . اگه ابهامی در نوشته هام هست بگید . ممنون که پاسخم رو میدید .

یوسف زالی
یک شنبه 16 تیر 1392, 21:11 عصر
procedure TForm1.Button1Click(Sender: TObject);
var
y, m: string;
begin
ADOCommand1.CommandText := 'insert into TBL4 select * from TBL3 where Year in (%s) and Month in (%s)';
y := '''' + StringReplace(ListBox1.Items.Text, #13#10, ''', ''', [rfReplaceAll]) + '''';
m := '''' + StringReplace(ListBox2.Items.Text, #13#10, ''', ''', [rfReplaceAll]) + '''';
ADOCommand1.CommandText := Format(ADOCommand1.CommandText, [y, m]);
ADOCommand1.Execute;
end;

:لبخند:

disiba
یک شنبه 16 تیر 1392, 21:19 عصر
procedure TForm1.Button1Click(Sender: TObject);
var
y, m: string;
begin
ADOCommand1.CommandText := 'insert into TBL4 select * from TBL3 where Year in (%s) and Month in (%s)';
y := '''' + StringReplace(ListBox1.Items.Text, #13#10, ''', ''', [rfReplaceAll]) + '''';
m := '''' + StringReplace(ListBox2.Items.Text, #13#10, ''', ''', [rfReplaceAll]) + '''';
ADOCommand1.CommandText := Format(ADOCommand1.CommandText, [y, m]);
ADOCommand1.Execute;
end;

:لبخند:

ممنون از پاسختون . من تازه کارم . لطف کنید بگید منظور از ' ' ' ' و #13#10 چیه ؟

یوسف زالی
یک شنبه 16 تیر 1392, 21:32 عصر
اولی یعنی یک ' اضافه کن. برای قاطی نشدن باید از دو تا ' استفاده کرد.
دومی هم کد اینتر هست.

disiba
یک شنبه 16 تیر 1392, 23:50 عصر
اولی یعنی یک ' اضافه کن. برای قاطی نشدن باید از دو تا ' استفاده کرد.
دومی هم کد اینتر هست.

من sql بلد نیستم .توی برنامه بالا علامت s% نشانگر چیست ؟ ممنون

یوسف زالی
دوشنبه 17 تیر 1392, 00:12 صبح
به SQL ربطی نداره. اون یک PlaceHolder رشته هست.
در دستور Format استفاده می شه.

disiba
دوشنبه 17 تیر 1392, 00:31 صبح
به SQL ربطی نداره. اون یک PlaceHolder رشته هست.
در دستور Format استفاده می شه.

از حوصلتون ممنونم . با راهنمایی شما برنامه رو نوشتم . توی اجرا خطا نداره ولی چیزی توی جدول 4 ذخیره نمیکنه

یوسف زالی
دوشنبه 17 تیر 1392, 00:39 صبح
برای راهنمایی بیشتر باید کدتون رو ببینم.

disiba
دوشنبه 17 تیر 1392, 01:08 صبح
برای راهنمایی بیشتر باید کدتون رو ببینم.
ممنون . فردا کل برنامه و بانک رو براتون ارسال می کنم .

سلام
کل برنامه رو براتون mail کردم

arefba
دوشنبه 17 تیر 1392, 16:34 عصر
یه sql command بنویس و اون رو به به دیتا بیست بده تا اجاره بشه