PDA

View Full Version : تهیه دیسکت حقوق



seyed_27
سه شنبه 24 آذر 1388, 23:48 عصر
سلام
من تو دو پست زیر چند سوال مطرح کردم ولی نتونستم جوابای دوستان رو عملی کنم
لذا برنامه ای که بصورت ساده طراحی کردم رو میگذارم و دوباره خواسته هام رو مطرح میکنم و از دوستان خواهشمندم که تغییرات رو در برنامه بدن(با توجه به اینکه بنده در دیتابیس دلفی تازه کارم بخاطر همین مزاحم دوستان شدم)
http://barnamenevis.org/forum/showthread.php?p=868272
http://barnamenevis.org/forum/showthread.php?t=194435
اشکالات بنده:
1- دو فیلد siba و mablagh در بانک وجود دارد که میخوام مثلا در سیبا که طولش 13 تاست عدداش با 13 تا صفر(0000000000000) باشه و وقتی کاربر عدد ها رو وارد میکنه به ترتیب از
سمت راست جایگزین صفرها بشه. مثلا وقتی عدد 345 رو زد مقدار فیلد بشه: 0000000000345
و این امکان برای تمام رکوردها مخصوصا در export کردن بانک به فایل متنی برای این دو فیلد در همه رکوردها انجام بشه: برای اینکار دو راه وجود داره 1- در ورود اعداد این صفرها جایگزین بشن(در dbgrid یا dbedit)
2-عدد ها بصورت معمول(مثلا 345) ذخیره بشن ولی در export به فایل متنی این صفرها با تفاضل طول عدد وارد شده با طول فیلد اضافه بشن که من همین کار رو کردم ولی جواب نمیده و درست export نمیشه


اشکال دوم من: من دوتا جدول دارم table1 , table2 در جدول1 فیلدی به نام check از نوع true /false هست . میخوام هر رکوردی که مقدار این فیلد آنها true هست در جدول 2 کپی بشن
دوستان راه حل هایی ارائه دادن ولی نمیدونم چرا اجرا نمیشه
با تشکر

benyaminrahimi
چهارشنبه 25 آذر 1388, 08:29 صبح
بايد اين نکته رو در نظر بگيريد که calc فيلد تو دلفي يا تو ژروسيجري که تو اس کيو ال باشه نوع حرفي باشه

منظورتو نميفهم نميشه يعني چي

تو اگه بخواي تودلفي کار کني يک کلک فيلد ميسازي بعد تو event oncalcfileds ديتاست مي گي طول فيلد اصلي رو با تابع length حساب کنه بعد از 13 کم کنه بعد بايک حلقه تعداد 0 هايي که مي خواي بساز و بعد مقدار 0 ها و فيلد رو به صورت رشته اي جمع بزن

ديگه ساده تر از اين؟

benyaminrahimi
چهارشنبه 25 آذر 1388, 08:31 صبح
مشکل دوم

insert into tbl_2 (f1,f2,f3)select f1,f2,f3 from tbl_1 where check=1

seyed_27
چهارشنبه 25 آذر 1388, 12:35 عصر
تو اگه بخواي تودلفي کار کني يک کلک فيلد ميسازي بعد تو event oncalcfileds ديتاست مي گي طول فيلد اصلي رو با تابع length حساب کنه بعد از 13 کم کنه بعد بايک حلقه تعداد 0 هايي که مي خواي بساز و بعد مقدار 0 ها و فيلد رو به صورت رشته اي جمع بزن
من یه کارایی در قسمت export txt کردم یه نگاهی به سورس بندازید ولی نمیدونم چرا خوب کار نمیکنه

seyed_27
چهارشنبه 25 آذر 1388, 12:46 عصر
مشکل دوم

insert into tbl_2 (f1,f2,f3)select f1,f2,f3 from tbl_1 where check=1
من دستور زیر رو نوشتم

insert into table2(name,family)
select name,family from table1 where check=1
ولی پیام خطا داد
پیام: commandtext does not return a result set

masood samadi
چهارشنبه 25 آذر 1388, 13:09 عصر
سلام دوست عزیز

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


Adoquery1.sql.text:='insert into table2(code,name,family) select code,name,family from table1 where check=true'
Adoquery1.execsql



لطفا خبر جواب دادن یا ندادنش رو بده

farhad110
چهارشنبه 25 آذر 1388, 15:19 عصر
سلام. برای حل مشکل اول از کدی شبیه کد زیر استفاده کنید و داده ها رو با فرمت 13 کاراکتر وارد کنید

var
s,str:string;
len,i:integer;
begin
str:='345';
len:=Length(str);
if (len<13) then
for I := 1 to 13-len do
s:=s+'0';
str:=s+str;
ShowMessage(str);
end;
کد بالا راه حل مشکل شما هست. اما راه حل تایید شماره حساب های سیبا نیست. این حساب ها از 4 قسمت مختلف تشکیل شده و با این روش نمیتونید صحت نوشتاری شماره ها رو بررسی کنید. اگر توضیح بیشتر نیاز بود بفرمایید
پیغام خطایی که برای مشکل دوم گرفتید به این دلیل هست که شما متد open رو فراخوانی کردید در حالی که رکوردی برای انتخاب از دیتابیس ندارید. جواب masood samadi بدون مشکل هست چون execSql رو به کار بردند
موفق باشید

seyed_27
چهارشنبه 25 آذر 1388, 21:45 عصر
لطفا خبر جواب دادن یا ندادنش رو بده
سلام بسیار ممنونم این مورد درست شد

seyed_27
چهارشنبه 25 آذر 1388, 21:51 عصر
اگر توضیح بیشتر نیاز بود بفرمایید
همین طور که تو برنامه دیدید از dbedit و dbgrid استفاده کردم. تو سوال هم عرض کردم که یا در هنگام ورود اطلاعات عدد جایگزین صفرها بشه یا اینکه عدد بصورت معمول وارد بشه ولی در هنگام تبدیل به فایل متنی هر فیل چک بشه و طول اون از 13 کم بشه و مابه تفاوت صفر اضافه بشه شبیه این کار رو کردم کدش رو میگذارم (البته تو کدی که در بالا ضمیمه کردم ، آوردم) ولی درست کار نمیکنه چرا؟

var
siba,mablagh:string;
a,b,c,d,e,f: integer;
st:string;
outfile:textfile;
filename:string;
temp:string;
begin
savedialog1.FileName:=filename;
if savedialog1.Execute then
begin

filename:=savedialog1.FileName;
assignfile(outfile,filename);
rewrite(outfile);
adotable2.First;
while (adotable2.Eof=false) do
begin
if adotable2.FieldValues['code']<>null then
begin

/////////////////mablagh

b:=length(adotable2.FieldValues['mablagh'] );
b:=5-b;
while b<>0 do begin
mablagh:=adotable2.FieldValues['mablagh'];
mablagh:='0'+mablagh;
b:=b-1;
end;


/////////////////siba

b:=length(adotable2.FieldValues['siba'] );
b:=13-b;
while b<>0 do begin
siba:=adotable2.FieldValues['siba'];
siba:='0'+siba;
b:=b-1;
end;
//temp:=adotable1.FieldValues['code']+adotable1.FieldValues['name']+adotable1.FieldValues['family'];
writeln(outfile,siba+mablagh);
adotable2.Next
end
else
adotable2.Next;
end;
closefile(outfile);
end;

farhad110
چهارشنبه 25 آذر 1388, 22:36 عصر
در هنگام تبدیل به فایل متنی هر فیل چک بشه و طول اون از 13 کم بشه و مابه تفاوت صفر اضافه بشه شبیه این کار رو کردم کدش رو میگذارم (البته تو کدی که در بالا ضمیمه کردم ، آوردم) ولی درست کار نمیکنه چرا؟
برنامه شما روندیدم. به کدی که گذاشتم توجه کنید. دقیقا برنامه ای شبیه کار شما داشتم و این کد نیاز شما رو برطرف میکنه
چون با شماره حساب سر و کار دارید بهتره قبل از تبدیل به فایل متنی و در هنگام Insert کردن اطلاعات، فرمت مورد نظر رو ایجاد کنید تا نیاز به تبدیل در جاهای مختلف نداشته باشید

seyed_27
پنج شنبه 26 آذر 1388, 13:02 عصر
سلام
مشکل export کردن و صفرها حل شده
چند سوال دیگه:
1- من وقتی از جدول 1 به جدول 2 رکوردهایی رو با دستور زیر اضافه میکنم تغییرات رو در جدول2 نشون نمیده بخاطر همین از کد زیر استفاده کردم آیا این کار روش خوبیه:
ADOQuery1.SQL.Clear;
Adoquery1.sql.text:='insert into table2(name,family) select name,family from table1 where check=true';
ADOQuery1.ExecSQL; //ADOQuery1.Prepared;
ADOQuery1.Close;
ADOTable1.Active:=false;
ADOTable1.Active:=true;
adotable1.Refresh;
dbgrid1.Refresh;
2- جدول 2 با جدول 3 بوسیله دو فیلد code لینک شده و وقتی که مثلا : در جدول 3 ،رکورد جاری ، فیلد code اون مقدارش 3 هست جدول شماره 2 تمام رکوردهایی که فیلد code اونا 3 هست رو نمایش میده.
اشکال اینجاست که وقتی با دستورات بالا رکوردهایی انتخابی رو به جدول2 اضافه میکنم: انتظار دارم فیلد code اونا هم 3 بشه (یعنی با رکورد جاری جدول 3 لینک بشه)ولی سیستم مقدار فیلد code در رکوردهای اضافه شده به جدول2 رو صفر میگذاره ؟
کدها رو ضمیمه میکنم

حسین شهریاری
شنبه 28 آذر 1388, 09:43 صبح
سلام
کد فوق برای نمایش تغییرات درست است ولی دلیل این که مقدار صفر درون فیلد code در Table1 درج میشه اینه که باید فیلد کد را در دستور Insert اضافه شود.

ADOQuery1.SQL.Clear;
Adoquery1.sql.text:='insert into table2(code,name,family) select code,name,family from table1 where check=true';
ADOQuery1.ExecSQL; //ADOQuery1.Prepared;
ADOQuery1.Close;
ADOTable1.Active:=false;
ADOTable1.Active:=true;
در ضمن وقتی خاصیت اکتیو تیبل را فالس و ترو میکنید دیگه نیازی به رفریش کردن اون نیست.

seyed_27
شنبه 28 آذر 1388, 12:45 عصر
کد فوق برای نمایش تغییرات درست است ولی دلیل این که مقدار صفر درون فیلد code در Table1 درج میشه اینه که باید فیلد کد را در دستور Insert اضافه شود.
اشتباه نشه
من میخوام وقتی از دستور فوق الذکر استفاده میکنم مقدار فیلد code از رکورد جاری table3 در تمام رکوردهایی که با دستور بالا از جدول یک select شده در هنگام insert درtable2درج بشه

با توجه به اینکه جدول 2 و 3 با فیلد code لینک شده اند و وقتی در جدول 2 یک رکورد جدید ایجاد میکنم مقدار فیلد code رکورد جاری در table 3 رو خودش در فیلد Code در جدول2 درج میکنه
مشکل من در کپی رکوردها از جدول 1 به 2 و اختلال در پیوند جدول 2و3 ست به این صورت که وقتی کپی صورت میگیره بجای درج مقدار فیلد code رکورد جاری جدول 3 در فیلد code رکوردهای کپی شده از جدول 1به 2 مقدار صفر رو درج میکنه؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟

حسین شهریاری
شنبه 28 آذر 1388, 13:05 عصر
فکر کنم بحث MASTER-DETAIL مشکل شما را حل کنه.

seyed_27
شنبه 28 آذر 1388, 18:50 عصر
فکر کنم بحث MASTER-DETAIL مشکل شما را حل کنه
من تو سایت سرچ کردم ولی چیزی پیدا نکردم
اگر لینک خاصی هست معرفی کنید

vcldeveloper
یک شنبه 29 آذر 1388, 02:40 صبح
http://www.google.com/cse?cx=010277259273172057471%3Agbud9yj2nhi&q=master+details+%D8%AF%D9%84%D9%81%DB%8C&x=0&y=0&siteurl=barnamenevis.org%2Fforum%2Fshowthread.php% 3Ft%3D195246%26page%3D2

seyed_27
یک شنبه 29 آذر 1388, 17:46 عصر
تو لینکی که گذاشتید چیز دندون گیری پیدا نکردم. شما تاحالا با این مشکل تو برنامه هاتون برخورد نکردید:
آیاراهی هست که این نوع کپی کردن از جدول ثالث به جدولی که MASTER/DETAIL شده رو حل کنه؟؟؟؟؟؟؟؟

seyed_27
شنبه 05 دی 1388, 15:47 عصر
تو یه سایت دیگه بچه ها مشکلم رو حل کردند یه نمونه مثال دادند که میگذارم