ورود

View Full Version : ساخت لیست باکس از روی یک ستون خاص AdoQuery



rk1983xx
دوشنبه 08 فروردین 1390, 01:54 صبح
من قبلا یه کد دیده بودم که الان یادم نمیاد
خیلی هم توی تاپیک ها گشتم ولی پیدا نکردم
اگه راهنمائیم کنید ممنون میشم
1)چه جوری میتونم به استفاده از یک دستور یک ستون از یک کوئری رو در یک Listbox یا TStrings ذخیره کنیم ؟
بدون استفاده از حلقه تکرار
چون ممکنه فرم من چندین بار پشت سر هم فراخوانی بشه و منطقی نیست که برای آپدیت کردن لیست باکسم از حلقه تکرار استفاده کنم

یه چیزایی شبیه به
ListBox1.Item.LoadfromStream()
فقط نمیدونم چه جوری تمام مقادیر ستون مثلا عنوان رو در یک استریم قرار بدم
و


2) اینکه آیا راهی هست که بصورت یکجا و نا با حلقه تکرار لیست باکسی با استفاده از ویژگی آبجکت بسازم که کد و عنوان (از همون کوئری) رو توش داشته باشم و با انتخاب عنوان کد رو توی DB ذخیره کنم ؟

rk1983xx
دوشنبه 15 فروردین 1390, 20:09 عصر
یعنی هیچ کس نیست به این سوال من جواب بده ؟
:گریه: :گریه: :گریه:

M_Maskout
چهارشنبه 17 فروردین 1390, 08:15 صبح
سلام
شما باید از یه کنترل آگاه از داده (Data aware control) استفاده کنید.
از برگه (Tab)،‏ Data Access یه DataSource (68365) به فرمتون اضافه کنید.
نام آبجکتی که جدول شما رو کنترل می‌کنه تو ویژگی DataSet قرار بدین.

Data aware controlها رو می‌تونید از برگه Data Controls به دست بیارین.
از برگه (Tab)، ‏Data Controls، یه DBLookupListBox (68364)به فرمتون اضافه کنید.
ویژگی ListSource رو با نام DataSource ایجاد شده (مثلاً DataSource1) تنظیم کنید.
ویژگی KeyField رو با نام فیلد مورد نظرتون تنظیم کنید.
با Active کردن کنترل جدول، محتویات فیلد مورد نظر از تمام رکوردها، لیست می‌شود.

rk1983xx
چهارشنبه 17 فروردین 1390, 10:36 صبح
سلام
شما باید از یه کنترل آگاه از داده (Data aware control) استفاده کنید.
از برگه (Tab)،‏ Data Access یه DataSource (68365) به فرمتون اضافه کنید.
نام آبجکتی که جدول شما رو کنترل می‌کنه تو ویژگی DataSet قرار بدین.

Data aware controlها رو می‌تونید از برگه Data Controls به دست بیارین.
از برگه (Tab)، ‏Data Controls، یه DBLookupListBox (68364)به فرمتون اضافه کنید.
ویژگی ListSource رو با نام DataSource ایجاد شده (مثلاً DataSource1) تنظیم کنید.
ویژگی KeyField رو با نام فیلد مورد نظرتون تنظیم کنید.
با Active کردن کنترل جدول، محتویات فیلد مورد نظر از تمام رکوردها، لیست می‌شود.

دوست عزیز این راه حل ساده و ابتدایی رو بلدم ولی این کنترل ها زمانی کار می کنند که شما اونارو به یه فیلد اختصاص بدید یعنی اینکه حتما باید مقدار انتخاب شده بطور خودکار به فیلد مقصد ارسال بشه
ولی منظور من اینه که بعنوان مثال مقادیر یک ستون از جدولم رو توی یه Tstrings داشته باشم تا بتونم به Pickup هام اختصاص بدم

vcldeveloper
چهارشنبه 17 فروردین 1390, 13:48 عصر
می تونید فیلد Lookup داشته باشید. در ضمن، اینکه شما در کد خودتون حلقه تکرار نداشته باشید، و به جاش فقط یک خط کد داشته باشید، به معنی این نیست که حلقه ایی در کار نباشه!

rk1983xx
چهارشنبه 17 فروردین 1390, 14:01 عصر
یادمه که یه دستوری بود که همه مقادیر یک ستون از یک جدول رو در یک استرینگ درج میکرد
منظور من این دستور یا لا اقل ترکیب هست
نه حلقه تکرار یا فیلد یا آبجکت
وقتی بیاد توی استرینگ دیگه هر کاری میشه کرد

vcldeveloper
چهارشنبه 17 فروردین 1390, 14:33 عصر
یادمه که یه دستوری بود که همه مقادیر یک ستون از یک جدول رو در یک استرینگ درج میکرد
همچین دستوری در دلفی وجود نداره. اصلا دلفی دستوری برای کار با بانک اطلاعاتی نداره، بلکه یک سری تابع و کلاس برای کار با بانک داره.

توابع هم دو حالت دارند، یا از بانک مستقیما کوئری می گیرند، یا اینکه دیتاست رو پیمایش می کنند، که در صورت پیمایش، میشه همون حلقه، فقط فرق اش اینه که شما حلقه رو نمی بینید، و فکر می کنید کد شما بدون حلقه کار کرده!

a_mosavian
چهارشنبه 17 فروردین 1390, 16:04 عصر
همچین دستوری در دلفی وجود نداره. اصلا دلفی دستوری برای کار با بانک اطلاعاتی نداره، بلکه یک سری تابع و کلاس برای کار با بانک داره.

توابع هم دو حالت دارند، یا از بانک مستقیما کوئری می گیرند، یا اینکه دیتاست رو پیمایش می کنند، که در صورت پیمایش، میشه همون حلقه، فقط فرق اش اینه که شما حلقه رو نمی بینید، و فکر می کنید کد شما بدون حلقه کار کرده!
بدون حلقه هم میشه این کار را انجام داد، اما همانگونه که آفای کشاورز فرمودند نه در سطح دلفی که در سطح SQL. یعنی یک کوئری استفاده کنیم که داده های فیلد مورد نظر رو به صورت مدنظر برگردونه. برای این کار از کد زیر برای کوئری استفاده می کنیم.
SELECT CONVERT(nvarchar(max), field_name) + CHAR(13) + CHAR(10) AS [text()]
FROM table_name WHERE (1 = 1) for xml path('')
قسمت WHERE رو هم درج کردم که بدونید باید کجا بگذاریدش :لبخند:
این دستور در واقع برای تولید یک فایل xml از روی داده ها بکار می رود. برای نمونه هنگامی که می خواهید داده های جدولی را در پی یک درخواست xmlrpc یا soap برگردانید برای اینکه درد و خونریزی نداشته باشد باید از این روش بهره گیرید. کنون ما با کمی دستکاری، کاری کرده ایم که مولفه های xml حذف شوند و نتیجه شبیه یک متن ساده در آید.
از آنجا مقدار برگشتی این دستور در ADO از نوع ADOStream می باشد برای دریافت محتوای آن در دلفی نیز از متد زیر بهره بگیرید:
function SQLtoXML(Conn: TADOConnection; SQLCmd: string): string;
const
adExecuteStream = 1024;
var
Command: _Command;
Stream: OleVariant;
RecordsAffected: OleVariant;
Parameters: OleVariant;
begin
Command := CreateOleObject('ADODB.Command') as _Command;
Command.Set_ActiveConnection(Conn.ConnectionObject );
Command.CommandType := ADOInt.adCmdText;
Command.CommandText := SQLCmd;
Stream := CreateOleObject('ADODB.Stream');
Stream.Open;
Command.Properties['Output Stream'].Value := Stream;
Parameters := EmptyParam;
Command.Execute(RecordsAffected, Parameters, adExecuteStream);
Stream.Position := 0;
Result := Stream.ReadText;
end;