ورود

View Full Version : سوال در خصوص SQL



rahro
دوشنبه 29 آبان 1385, 12:33 عصر
با سلام
دوستان کجای این کد اشتباه است


SELECT so_tg,de_tg,sanad,so_date,desc2,;
sum(sa_bed) as f7 ,sum(va_bes) as f8 from markaz;
INTO CURSOR t24t11_2 GROUP BY sanad
که سیستم خطای زیر را اعلام میکند

SQL:GROUOP BY clause missing or invalid

mehran_337
دوشنبه 29 آبان 1385, 14:51 عصر
دستور sum دیگر نیازی به تعریف فیلدهای اولیه ندارد خط اول اشتباه است
یا می خواهید مجموع ها را بیینید یا فیلدها را.
یعنی یا کرسر ایجاد شده باید رکوردها را نشان دهد یا فقط یک رکورد گروپ شده را

rahro
دوشنبه 29 آبان 1385, 16:33 عصر
دستور sum دیگر نیازی به تعریف فیلدهای اولیه ندارد خط اول اشتباه است
یا می خواهید مجموع ها را بیینید یا فیلدها را.
یعنی یا کرسر ایجاد شده باید رکوردها را نشان دهد یا فقط یک رکورد گروپ شده را
دقیقا" درسته اصلا به این نکته تمرکز نکرده بودم
متشکرم

rahro
سه شنبه 30 آبان 1385, 09:54 صبح
اگر بخواهم حین گروه بندی نام هر گروه را هم از بانک دیگری داشته باشم چه دستوری باید بنویسم ؟ این کد خطا داد؟!!


SELECT sanad.kod_m_tf as kod1,sum(sanad.bed) as bed1,sum(sanad.bes) as bes1;
,koding.nam_m_tf from sanad,koding WHERE sanad.kod_m_tf=koding.kod_m_tf;
GROUP BY sanad.kod_m_tf INTO CURSOR t4576

rahro
سه شنبه 30 آبان 1385, 11:54 صبح
کسی نمیدونه ؟!

rahro
چهارشنبه 01 آذر 1385, 05:25 صبح
عزیزان شما تا کنون به این مثال بر نخوردید؟ اگر روش اشتباهه و این کار شدنی نیست حداقل راهنمایی کنید تا ببنیم روش شما چگونه است.
من یک بانک دارم که کدئینگ حسابداری در آن ذخیره است و بانک دیگری اسناد حسابداری میخواهم با دستورات SQL گزارشی تهیه کنم که خلاصه گزارش روزانه حسابها رو استخراج کنم مطمئنا باید آنها را گروه بندی کنم ! والبته نام هر حساب را هم باید از بانک کدینگ بیاورم . همین
من قبلا از حلقه و آرایه استفاده میکردم و در اخر نتایج آرایه را به یک تیبل و سپس به ریپورت !!
حال که قدرت SQL رو فهمیدم میخوام از این روش استفاده کنم .
رهرو

rezaTavak
چهارشنبه 01 آذر 1385, 09:39 صبح
فکر کنم شما باید نحوه اتصال جداول را به هم بگویید چون از دو جدول استفاده کرده اید مانند INNER JOIN,LEFT,RIGHT ,FULL

rezamim
چهارشنبه 01 آذر 1385, 11:52 صبح
اگر بخواهم حین گروه بندی نام هر گروه را هم از بانک دیگری داشته باشم چه دستوری باید بنویسم ؟ این کد خطا داد؟!!


SELECT sanad.kod_m_tf as kod1,sum(sanad.bed) as bed1,sum(sanad.bes) as bes1;
,koding.nam_m_tf from sanad,koding WHERE sanad.kod_m_tf=koding.kod_m_tf;
GROUP BY sanad.kod_m_tf INTO CURSOR t4576


همونطور که آقای توکل گفتند ، کد شما تقریبا باید به حالت زیر باشه


SELECT sanad.kod_m_tf as kod1,sum(sanad.bed) as bed1,sum(sanad.bes) as bes1,koding.nam_m_tf ;
from sanad ;
left outer join koding on sanad.kod_m_tf = koding.kod_m_tf ;
GROUP BY sanad.kod_m_tf ;
INTO CURSOR t4576



البته چون فکر کنم بانک koding شما مربوط به کدهای حسابداری و بانک sanad مربوط به سندها باشه ( خسته نباشم ! )
این کد بهتره


SELECT koding.nam_m_tf, sanad.kod_m_tf as kod1,sum(sanad.bed) as bed1,sum(sanad.bes) as bes1 ;
from koding ;
left outer join sanad on koding.kod_m_tf = sanad.kod_m_tf ;
GROUP BY koding.kod_m_tf ;
INTO CURSOR t4576

rahro
چهارشنبه 01 آذر 1385, 12:24 عصر
نه دوستان نشد که نشد
من گوشه مربوطه را برایتان آپلود میکنم ببینید و تست کنید
پیشنهاد میکنم خودتان یک فرم جدید بسازید!

rahro
چهارشنبه 01 آذر 1385, 18:37 عصر
سلام
جناب "بی نیاز" پیشنهاد دادن که کد به روش ذیل اصلاح بشه و من اصلاح کردم و جواب گرفتم ولی ایشان معتقد بودند که این کد استاندارد نیست و باید تست بشه نظر دوستان چیه ؟


SELECT sanad.kod_m_tf as kod1,sum(sanad.bed) as bed1,sum(sanad.bes) as bes1;
,koding.nam_m_tf from sanad,koding WHERE sanad.kod_m_tf=koding.kod_m_tf;
GROUP BY sanad.kod_m_tf,koding.nam_m_tf INTO CURSOR t4576

نام سرفصل هم در گروپ قرار گرفته.
در ضمن من چطوری میتوانم انگلیسی رو مثل دوستان بفرستم و از این اشفتگی جلوگیری کنم؟

rezaTavak
شنبه 04 آذر 1385, 16:36 عصر
درمورد کد هایت از [ code] و [/code] استفاده کنید البته بدون فاصله. یکی از آنهایی که من برای شما ویرایش کردم را نگاه کنید (دکمه ویرایش را بزنید.)

rahro
دوشنبه 06 آذر 1385, 13:01 عصر
سلام
سلام
دوستان امروز برای تست بین 546379 رکورد یک بانک اطلاعاتی فرامین زیر را تست کردم


SELECT markaz.de_tg,markaz.so_date,markaz.sanad from markaz;
WHERE so_date between '81/01/01' AND '81/12/30'

و فرمان ذیل


SET FILTER TO BETWEEN(so_date,'81/01/01','81/12/30')

جالب اینکه نتیجه فرمان دوم خیلی سریعتر عمل میکرد در فرمان اول وقفه ای حدود 1.5 ثانیه ای وجود داشت که پردازشگر مربوطه عملیات پردازش را به صورت نمودار به نمایش گذاشت و در فرمان دوم وقفه ای مشاهده نشد
چرا ؟
چه موقع باید از فرامین SQL و چه موقع باید از سایر فرمانها استفاده کرد؟ آیا راهنمای خاصی وجود دارد یا باید با تست یکی را انتخاب کرد؟
آیا با فرمان خاصی پس از کمپایلر پروژه ممکنه نمودار پردازشگر SQL نمایش داده نشود .
شایان ذکر است سیستم من پنتیوم فور با سی پی یو 2.8 و هارد 120 و رم 1024 میباشد
رهرو

rezaTavak
سه شنبه 07 آذر 1385, 08:13 صبح
اصلا عمل و کاربرد فرمان اول و دوم فرق دارد.

اولی یک جدول دیگر می سازد و دومی فقط اگر رکورد حائز شرط بود نمایش میدهد.

اولی در ابتدا کند و بعدا بدون وقفه اما دومی ابتدا بدون وقفه و بعدا دارای وقفه

دومی اگر ایندکس داشته باشد و از Rushmore استفاده شود بسیار خوب عمل خواهد کرد!

اما در اولی نه.

فرمان SQL یک جدول جدید می سازد. اوصلا این فرمان به درد بانکهای رابطه ای می خورد (فاکس بانک رابطه ای خیلی قدمت دار است) یعنی از چند جدول یک جدول.

در بانکهای دیگر شما فرمانهای SET را ندارید و فقط SELECT دارید مانند MySQL و SQLServer و...
Select برای کارهای پیچیده است اما SET نه.
و...

فکر کنم برای عدم نمایش ProccessBar از Set talk off باید استفاده شود که البته کار درستی نیست!

mehran_337
سه شنبه 12 دی 1385, 23:45 عصر
وقتی از دستور select استفاده کردم می خوام کرسر جدید برچسب فیلدهام فارسی باشه
کد select field as
هیچ مشکلی نیست اما وقتی او برچسب فاصله داشته باشه مثل "شماره تلفن"
دیگه این دستور خطا می ده . چیکار باید کرد؟

rezaTavak
چهارشنبه 13 دی 1385, 07:41 صبح
از خط زیر استفاده کن چون فاصله جدا کننده است.

mehran_337
چهارشنبه 13 دی 1385, 08:46 صبح
یعنی دیگه هیچ راهی نداره؟

rahro
چهارشنبه 13 دی 1385, 12:41 عصر
وقتی از دستور select استفاده کردم می خوام کرسر جدید برچسب فیلدهام فارسی باشه
کد select field as
هیچ مشکلی نیست اما وقتی او برچسب فاصله داشته باشه مثل "شماره تلفن"
دیگه این دستور خطا می ده . چیکار باید کرد؟
سلام
عذر میخوام مهرجان جام میتونم بپرسم در کجا میخوای از این دستور استفاده کنی؟
آخه در بعضی جاها راهایی داره مثلا brow

rezaTavak
چهارشنبه 13 دی 1385, 20:51 عصر
مطمئن نیستم اما کاراکتر ۲۵۵ هم شاید جواب بدهد.

یا می تونید با ریختن توی یک جدول (into table) و browse :H هدر تعیین کنید. بعد هم جدول را پاک کنید.

mehran_337
یک شنبه 17 دی 1385, 09:14 صبح
با دستور select اطلاعاتی در کرسر قرار دارد حال این اطلاعات باید اصلاح شود تا در حدول اصلی هم اصلاحات انجام شود مثلا :
فیلد منطقی داریم و باید انتخاب شود(چک باکس در گرید) اما پیغام می دهد که نمی توانید کرسر را آپدیت کنید چون ریدآنلی است .
آیا کرسر را نباید آپدیت کرد؟
چطور بین کرسر و بانک اصلی ارتباط برقرار کند .؟
با تشکر

عفت بزرگه
یک شنبه 17 دی 1385, 10:42 صبح
در مورد استفاده از کرسرها کلا احتیاط کنید

mehran_337
یک شنبه 17 دی 1385, 11:12 صبح
با تشکر اما می خوام بدونم آپدیت می شه کرد یا من اشتباه می کنم؟
راهش چیه؟