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

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

این مقاله برای خوانندگانی است که با زبان SQL آشنا هستند.

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

در زیر جدولی از مکاتبات بین زبان اصلی پرس و جو و عملگرهای SQL آمده است:

اپراتورهای زبان پرس و جو 1C

بیانیه SQL

مختلف

ترکیب

دسته بندی بر اساس

ترکیب کنید

مرتب سازی بر اساس

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

اجرای یک درخواست 1C از کد برنامه با استفاده از شی زبان داخلی "درخواست" انجام می شود. نمونه ای از نوشتن کوئری پایگاه داده با استفاده از زبان برنامه نویسی داخلی:

درخواست = درخواست جدید; Query.Text = "انتخاب | Synonym.Link AS Link |FROM | Directory.Directory1 AS مترادف"; Select = Query.Run().Select(); در حالی که Selection.Next() حلقه // درج پردازش انتخاب SelectionDetailedRecords EndCycle;

روش "Run" کوئری را اجرا می کند، روش "Select" مقداری از نوع "SelectFromQueryResult" را برمی گرداند. همچنین می توانید از روش Unload استفاده کنید که جدول مقادیر را برمی گرداند.

پارامترهای درخواست در ویژگی "Parameters" ذخیره می شوند (در این مورد، این یک ساختار است، بنابراین تمام روش های ساختار در اینجا قابل اجرا هستند - درج، حذف و غیره).

نمونه ای از تنظیم پارامتر "Query.Parameters.Insert" ("Directory"، DirectoryLink). در درخواست، می توانید با استفاده از علامت "&Directory" به پارامترها دسترسی داشته باشید. در زیر نمونه ای از درخواست با استفاده از پارامترها آورده شده است:

درخواست = درخواست جدید; Query.Text = "انتخاب | Users.Link AS Link, | Users.Parent AS Parent, | Users.Name AS Name |FROM | Directory.Users AS Users |WHERE | Users.Link = &Directory"; Query.Parameters.Insert("Directory", DirectoryLink); Select = Query.Run().Select(); در حالی که Selection.Next() حلقه // درج پردازش انتخاب SelectionDetailedRecords EndCycle;

بیایید به یاد داشته باشیم که زبان پرس و جو فقط برای خواندن داده ها از پایگاه داده در نظر گرفته شده است، بنابراین آنالوگ عبارات SQL مانند INS ERT و UPDATE ندارد. داده ها را فقط می توان از طریق مدل شیء زبان برنامه نویسی داخلی 1C تغییر داد. همچنین در زبان پرس و جو 1C اپراتورهایی وجود دارد که هیچ آنالوگ در SQL ندارند، به عنوان مثال:

  • در سلسله مراتب
  • محل
  • شاخص بر اساس

در سلسله مراتب- به شما امکان می دهد تمام عناصر دایرکتوری سلسله مراتبی را که در سلسله مراتب پیوند منتقل شده قرار دارند انتخاب کنید. درخواست نمونه با استفاده از در سلسله مراتب:

SELECT Products.Link، Products.Article FROM Directory.Products AS Products WHERE Products.Link IN HIERARCHY(&Citrus)"

در این صورت، نتیجه تمام عناصر زیرمجموعه فهرست نامگذاری مرکبات را برمی گرداند، مهم نیست که این فهرست چند سطح سلسله مراتبی داشته باشد.

همچنین، به عنوان مثال، وظیفه یافتن محصولی با نام "قلم" است. محصول باید در سلسله مراتب "لوازم التحریر" گنجانده شود. کالاها، یعنی ما مجبور نیستیم دنبال دستگیره در بگردیم. ساختار نامگذاری در این مورد به شرح زیر است:

دفتر

|_ خودکار |_ خودکار قرمز |_ خودکار آبی |_ خودکار |_ خط کش

تجهیزات جانبی

|_ دستگیره در |_ دستگیره درب ساده |_ دستگیره درب لوکس

ما درخواست زیر را می نویسیم:

Products.Link، Products.Article FROM Directory.Products AS Products WHERE Products.Name like "Pen%" AND Products.Link IN HIERARCHY(&Stationery)"

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

محل- این عبارت نتیجه را در یک جدول موقت قرار می دهد. درخواست نمونه:

SELECT Users.Link AS Link, Users.Parent AS Parent, Users.Name AS Name PLACE SelectedUsers FROM Directory.Users AS Users WHERE Users.Link = &Directory; SELECT SelectedUsers.Link AS Link, SelectedUsers.Parent AS Parent, SelectedUsers.Name AS Name FROM SelectedUsers AS SelectedUsers

این پرس و جو SQL توسط چندین کوئری اجرا می شود:

  • ایجاد یک جدول موقت (پلتفرم می تواند از جداول موقتی که قبلاً ایجاد شده اند استفاده مجدد کند، بنابراین ایجاد همیشه اتفاق نمی افتد).
  • قرار دادن داده ها در یک جدول موقت؛
  • اجرای کوئری اصلی، یعنی SEL ECT از این جدول موقت.
  • تخریب/تمیز کردن میز موقت.

یک جدول موقت را می توان به صراحت از طریق ساختار تخریب کرد از بین رفتن، یا به طور ضمنی - هنگام بستن مدیر جدول موقت.

شیء "Query" زبان برنامه نویسی داخلی دارای ویژگی "Temporary Table Manager" است که برای کار با جداول موقت در نظر گرفته شده است. کد نمونه:

MVT = New TemporaryTableManager(); درخواست = درخواست جدید; Query.TemporaryTableManager = MVT;

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

MVT.Close();

... یا هنگام پاک کردن یک متغیر از حافظه، یعنی هنگام اجرای روشی که متغیر در آن اعلام شده است. جداول موقت بار روی زیرسیستم دیسک را افزایش می دهند، بنابراین نباید زیرسیستم های موقت زیادی (مثلاً در یک حلقه) یا زیرسیستم های با حجم زیاد ایجاد کنید.

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

مشاوره تخصصی رایگان

از درخواست شما متشکریم!

یک متخصص 1C در عرض 15 دقیقه با شما تماس خواهد گرفت.

ویژگی های برخی از عملگرهای زبان پرس و جو

برای تغییر- این عملگر برای قفل کردن یک جدول پرس و جو خاص (یا همه جداول شرکت کننده در پرس و جو) در نظر گرفته شده است. قفل کردن با اعمال یک قفل U بر روی میز انجام می شود. در SQL این از طریق اشاره UPDLOCK پیاده سازی می شود. این طراحی برای جلوگیری از بن بست ضروری است. نمونه ای از درخواست با ساخت و ساز برای تغییر:

SELECT Users.Link AS Link, Users.Parent AS Parent, Users.Name AS Name FROM Directory.Users AS Users LEFT JOIN Directory.RFK AS RFK BY Users.RFK = RFK.Link TO CHANGE Directory.Users

در این مثال، U lock روی جدول Users قرار خواهد گرفت. اگر جدولی را برای قفل مشخص نکنید، بر روی تمام جداول شرکت کننده در پرس و جو اعمال می شود. توجه به این نکته ضروری است که این طرح فقط در پیکربندی هایی کار می کند که در آن حالت مدیریت قفل خودکار فعال باشد.



ترکیب- درخواست از اتصالات پشتیبانی می کند چپ/راست، کامل، درونی،که مربوط به اتصالات در SQL است – LEFT/RIGHT JOIN، OUTER JOIN، Inner Join.

با این حال، هنگام استفاده از سازنده پرس و جو نمی توانید این کار را انجام دهید راست بپیوندید.سازنده به سادگی جداول را عوض می کند، اما عملگر همیشه چپ دست خواهد بود. به همین دلیل، هرگز استفاده از اتصال راست را در 1C نخواهید دید.

از نظر نحوی، اتصال به این صورت است:

SELECT Table1.Link AS Link FROM Directory.Directory1 AS Table1 LEFT JOIN Directory.Directory2 AS Table2 BY Table1.Attributes = Table2.Attributes

زبان پرس و جو 1C عملگر برای پیوستن به محصول دکارتی (CROSS JOIN) ندارد. با این حال، عدم وجود اپراتور به این معنی نیست که زبان پرس و جو از چنین اتصالی پشتیبانی نمی کند. در صورت لزوم، می توانید به جدول هایی مانند زیر بپیوندید:

SELECT Table1.Link AS Link FROM Directory.Directory1 AS Table1 LEFT JOIN Directory.Directory2 AS Table2 BY TRUE

همانطور که از مثال مشخص است، کلید اتصال تنظیم شده است با درستی، یعنی هر ردیف از یک جدول با یک ردیف از جدول دیگر مطابقت دارد. نوع پیوستن (LEFT، RIGHT، FULL، INNER) اگر ردیف‌هایی در هر دو جدول دارید مهم نیست، اما اگر در یکی از جدول‌ها (مثلا جدول) ردیفی وجود نداشته باشد - نتیجه متفاوت خواهد بود. به عنوان مثال، هنگام استفاده از درونی؛ داخلینتیجه اتصال خالی خواهد بود. استفاده كردن چپ راستنتیجه اتصال بسته به جدولی که به آن می‌پیوندیم داده خواهد بود یا نخواهد بود - با داده یا نه. استفاده كردن پر شدهداده ها همیشه متصل می شوند (به طور طبیعی، فقط از یک جدول، زیرا دیگری خالی است، انتخاب نوع اتصال به وظیفه برنامه خاص بستگی دارد).

یک نکته بصری کوچک در مورد نحوه عملکرد انواع مختلف اتصال:



پسندیدن.برخلاف اپراتور SQL مشابه - LIKE، الگوی برای پسندیدنفقط با استفاده از چند کاراکتر خاص قابل تعیین است:

  • % (درصد): دنباله ای حاوی هر تعداد کاراکتر دلخواه.
  • _ (تاکید): یک کاراکتر دلخواه.
  • / - کاراکتر بعدی باید به عنوان یک کاراکتر معمولی تفسیر شود.

نتایج نرم افزارآنالوگ SQL عملگر ROLLUP است. مثال استفاده از اپراتور نتایج:

انتخاب محصولات.قیمت به عنوان قیمت، محصولات.محصول به عنوان محصول از فهرست راهنما. نامگذاری به عنوان محصولات نتایج میانگین (قیمت) بر اساس محصول

نتیجه به این صورت خواهد بود:

بستر

9833,333

اهن

خودکار

یعنی یک خط اضافی به نتیجه اضافه می شود که حاوی مقدار فیلدی است که توسط آن گروه بندی انجام می شود و مقدار تابع تجمیع.

کار با درخواست های دسته ای

1C به شما امکان می دهد با دسته ای از درخواست ها کار کنید. در یک درخواست دسته ای، متون درخواست با نقطه ویرگول (;) از هم جدا می شوند. درخواست دسته ای 1C به صورت متوالی اجرا می شود. نمونه متن درخواست دسته ای:

SELECT Users.Link AS Link, Users.Parent AS Parent, Users.Name AS Name FROM Directory.Users AS Users;
زمانبندی کاری.کاربر به عنوان کاربر، برنامه کاری.تاریخ به عنوان تاریخ، برنامه زمانی.ساعت کاری به عنوان ساعت کاری از اطلاعات ثبت نام.برنامه کاری به عنوان برنامه کاری

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

هنگام در نظر گرفتن یک زبان پرس و جو، ارزش ذکر ویژگی مانند جداول مجازی را دارد. جداول مجازی در پایگاه داده وجود ندارند. نمونه ای از پرس و جو 1C با استفاده از جداول مجازی:

RegisterLiabilitiesTurnovers.Liability AS Liability FROM RegisterAccumulations.RegisterLiabilities.Turnover() AS RegisterLiabilitiesTurnovers

چنین درخواستی برای DBMS به شکل زیر خواهد بود:

SEL ECT T1.Fld25931RRef FR OM (SELECT T2._Fld25931RRef AS Fld25931RRef, CAST(SUM(T2._Fld25936) AS NUMERIC(38, 8)) AS Fld25936Turnover(2SUFMld_,CAST. 8)) AS Fld25937Turnover_ FR OM dbo._AccumRgTn25938 T2 WH ERE ((T2._Fld949 = @P1)) AND ((T2._Fld25936 @P2 OR T2._Fld25937 @T25937 (B25937) GROUP1 2._Fld2 ) 5936 ) AS NUMERIC(38, 8))) 0.0 یا (CAST(SUM(T2._Fld25937) AS NUMERIC(38, 8))) 0.0) T1>>>>

می توان مشاهده کرد که شبیه SQL نیست، زیرا یک زیرپرس و جو، گروه بندی وجود دارد. جداول مجازی، به طور کلی، "شکر نحوی" هستند، یعنی به طور کلی برای راحتی در توسعه پرس و جو ایجاد می شوند، به طوری که پرس و جوها فشرده تر و خواناتر هستند.

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



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



در بدنه درخواست به شکل زیر است:

گردش مالی ثبت بدهی ها

برای راحتی نوشتن پرس و جوها، یعنی ایجاد متون پرس و جو، در 1C سازنده ای وجود دارد که می توان آن را از طریق منوی زمینه (دکمه سمت راست ماوس) فراخوانی کرد:



در طراح پرس و جو، می توانید لیست کاملی از توابع و عملگرهای زبان پرس و جو پشتیبانی شده را مشاهده کنید.


Query Builder یک ابزار بصری بسیار انعطاف پذیر برای ایجاد پرس و جو با هر پیچیدگی است. فقط در حالت پیکربندی موجود است. در حالت Enterprise یک به اصطلاح "کنسول پرس و جو" وجود دارد - این پردازش خارجی است که روی دیسک ITS تحویل داده می شود. برای یک برنامه مدیریت شده، کنسول پرس و جو را می توان از its.1c.ru دانلود کرد.

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

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

در زیر فهرستی از دلایل اصلی (اما نه همه) که منجر به اجرای آهسته پرس و جو می شود، آورده شده است.

  • استفاده از اتصالات با سوالات فرعی

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

  • استفاده از جداول مجازی در پیوندهای پرس و جو

جداول مجازی در سطح DBMS به عنوان سوالات فرعی اجرا می شوند، بنابراین دلایل آن مانند پاراگراف اول است.

  • استفاده از شرایط در یک پرس و جو که با شاخص های موجود مطابقت ندارد

اگر در شرایط درخواست (در اپراتور جایی کهیا شرایط جدول مجازی) از فیلدهایی استفاده می کند که همگی در فهرست گنجانده نشده اند، این پرس و جو با استفاده از اسکن جدول ساخت SQL یا اسکن فهرست (به طور کامل یا جزئی) اجرا می شود. این نه تنها بر زمان اجرای پرس و جو تأثیر می گذارد، بلکه یک قفل S بیش از حد روی ردیف های اضافی قرار می گیرد که به نوبه خود می تواند منجر به تشدید قفل شود، یعنی کل جدول قفل می شود.

  • استفاده از OR در شرایط پرس و جو

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

  • دریافت داده ها از طریق نقطه برای فیلدهای از نوع ترکیبی

به دست آوردن مقادیر از طریق یک نقطه (در ساخت و ساز) توصیه نمی شود مکان را انتخاب کنید، زیرا اگر مشخص شود که ویژگی شی یک نوع پیچیده است، اتصال با هر جدولی که در این نوع مختلط وجود دارد رخ می دهد. در نتیجه، پرس و جو DBMS به طور قابل توجهی پیچیده تر خواهد شد، که ممکن است بهینه ساز را از انتخاب طرح اجرای پرس و جو صحیح باز دارد.

از پایگاه داده با توجه به یک شرایط خاص. برای انجام این کار، در 1C 8.3 باید از پرس و جوهای تودرتو استفاده کنید.

اما باید در نظر داشت که در بیشتر موارد، پرس و جوهای تودرتو در 1C بدون اتصال نتایج آنها به جداول دیگر بی فایده هستند. تقریباً در هر صورت، چنین اتصالی اجرای درخواست را به طور کلی کند می کند.

نمونه ای از پرس و جوی تو در تو در زبان پرس و جو

من مثالی از پرس و جوی تودرتو برای . فرض کنید باید مقدار موجودی مشخصی را برای مشتریان فردی در تاریخ معینی نمونه برداری کنیم:

انتخاب کنید
عدم پرداخت مانده های پرداختی مشتری،
Non-DispatchPaymentsBalances.AmountBest
از جانب

267 درس ویدیویی را در 1C به صورت رایگان دریافت کنید:

LEFT JOIN ثبت نام تجمعی. عدم پرداخت مانده ها به عنوان عدم پرداخت پرداخت ها
نرم افزار AttachmentRequest.LinkToRequestCustomers = PaymentsBalances.Customer پرداخت نشده

هنگامی که DBMS چنین درخواستی را اجرا می کند، اقدامات نادرست توسط بهینه ساز ممکن است، زیرا تصمیم گیری در مورد برنامه ای برای پردازش پرس و جو دشوار است. هنگامی که یک DBMS به دو جدول می پیوندد، بهینه ساز الگوریتمی را بر اساس محاسبه تعداد رکوردهای این جداول می سازد.

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

که بهتر است؟

// جدول موقت
انتخاب کنید
مشتریان. پیوند مشتریان چگونه
PLACE tab مشتریان
از جانب
Directory.Customers AS مشتریان
WHERE Customers.Link B (&Customers)
;

// درخواست اصلی
انتخاب کنید
tabClients.Link،
موازنه های غیر پرداختی. AmountBest،
از جانب
tabCustomers چگونه tabCustomers
اتصال سمت چپ انباشته های توزیع نشده (.
,
مشتری B
(انتخاب کنید
tabCustomers.Customers
از جانب
tabCustomers)) HOW عدم پرداخت PaymentsBalances
تب نرم افزارCustomers.Customers = PaymentsBalances.Customers بدون پرداخت

همچنین آموزش ویدیویی مربوط به پرس و جوهای تودرتو را تماشا کنید:

اکنون بهینه ساز از قبل می داند که چه تعداد رکورد در جدول موقت وجود دارد و به راحتی الگوریتم پیوستن جدول را بهینه می کند.

اگر شروع به یادگیری برنامه نویسی 1C کرده اید، دوره رایگان ما را توصیه می کنیم (فراموش نکنید

طراح پرس و جو در 1C 8.3 و 8.2 یک ابزار توسعه قدرتمند است. این به شما امکان می دهد با استفاده از یک محیط بصری خاص یک متن درخواست بنویسید. بنابراین، برای ایجاد یک درخواست 1C، دانستن زبان پرس و جو داخلی کافی نیست.

سازنده پرس و جو مجموعه ای از برگه ها است که هر کدام مسئول قسمت خود از پرس و جو هستند. بنابراین برگه را پر کنید جداول و فیلدهاما جداول را انتخاب می کنیم که پرس و جو 1C داده ها و فیلدهای این جداول را که برای حل یک مشکل خاص لازم است را دریافت می کند. پر کردن سنگ تراشی شرایطما شرایطی را بر روی جداول انتخاب شده اعمال می کنیم تا از بین آنها فقط داده های مورد نیاز خود را انتخاب کنیم و غیره.

توضیحات طراح پرس و جو در وب سایت رسمی 1C 8: v8.1c.ru

جداول و فیلدها؛ ; ; ; ; ; پرس و جوهای تودرتو (در حال توسعه).

برای فراخوانی طراح پرس و جوی 1s 8 در کد برنامه باید:

  • یک درخواست جدید ایجاد کنید
درخواست = درخواست جدید;
  • یک خط متن درخواستی خالی تنظیم کنید
Request.Text = "";
  • نشانگر ماوس را بین نقل قول ها قرار دهید و دکمه سمت راست ماوس را فشار دهید. در منوی زمینه که باز می شود، مورد را انتخاب کنید سازنده پرس و جوو پاسخ آرهبه سوال در مورد ایجاد یک درخواست جدید. اگر متن درخواست قبلاً نوشته شده است، باید در هر جایی از آن کلیک کنید و سازنده را فراخوانی کنید ;

بیایید با استفاده از مثال های کوچکی از افزایش پیچیدگی، به تمام برگه های اصلی سازنده پرس و جو نگاه کنیم. این رویکرد به یک برنامه نویس مبتدی 1C اجازه می دهد تا به طور مؤثرتری سازنده و همه قابلیت های آن را مطالعه کند. برای مثال از پیکربندی استفاده خواهیم کرد حسابداری 3.0.

درس شماره 1. سازنده پرس و جو ساده ترین مورد استفاده است.

وظیفه: یک درخواست به فهرست نامگذاری بنویسید، کل نامگذاری فهرست را انتخاب کنید.

برگه های جدید: جداول و فیلدها

مکانیسم های جدید: مشاهده و ویرایش متن درخواست با استفاده از دکمه "درخواست".

برای شروع ایجاد یک درخواست، اجازه دهید یک درخواست جدید ایجاد کنیم و سازنده را فراخوانی کنیم (همانطور که در چند پاراگراف بالا نوشته شده است). پس از این، پنجره طراح در تب باز می شود جداول و فیلدها

قسمت تئوری درس شماره 1

Tab جداول و فیلدهاشامل سه بخش است:

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

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

  • یا روی جدول دوبار کلیک کنید.
  • یا از دکمه های ">" یا ">>" استفاده کنید.

بخش فوق جداولتعدادی دکمه وجود دارد. بیشتر آنها در درس های بعدی با جزئیات بیشتر مورد بحث قرار خواهند گرفت. فعلا فقط توضیحات مختصری می دهم.

  • یک سوال فرعی ایجاد کنید(خط قرمز). طراحی شده برای ایجاد یک پرسش فرعی جدید؛
  • ایجاد توضیحات جدول موقت(خط زرد). به شما امکان می دهد نام یک جدول موقت را که خارج از این پرس و جو قرار دارد، تعیین کنید.
  • تغییر عنصر فعلی(خط سبز). به شما امکان می‌دهد به زیرپرسمان انتخابی، جدول موقت یا شرح جدول موقت بروید.
  • حذف مورد فعلی(خط آبی). جدول انتخاب شده را از جداول انتخابی حذف می کند.
  • جدول را تعویض کنید(خط آبی). گفتگوی جایگزین کردن جدول انتخاب شده را باز می کند. اگر جدول مجازی ثبت نام اشتباهی را انتخاب کرده باشید مفید است، زیرا موقعیت یابی در جدول انتخاب شده فعلی در لیست رخ می دهد.
  • گزینه های جدول مجازی(خط بنفش). پارامترهای جدول ثبت مجازی را باز می کند.

زمینه های. این بخش فیلدهای جدول را از قسمت قبل انتخاب می کند. این فیلدها ستون های جدول یا انتخابی خواهند بود که در نتیجه پرس و جو به دست می آیند. آنها در درجه اول برای به دست آوردن اطلاعات لازم در یک مورد خاص از جداول انتخاب شده مورد نیاز هستند. به منظور انتقال آنها از بخش جداول مورد نیاز:

  • یا روی فیلد دوبار کلیک کنید.
  • یا از دکمه های ">" یا ">>" استفاده کنید.
  • همچنین می توانید با استفاده از یک عبارت دلخواه از فیلدهای جداول انتخابی و توابع زبان پرس و جو، یک فیلد جدید اضافه کنید.

بخش فوق زمینه هایتعدادی دکمه وجود دارد. ایجاد فیلدها با استفاده از عبارات دلخواه با جزئیات بیشتر در درس های بعدی مورد بحث قرار خواهد گرفت. فعلا فقط توضیحات مختصری می دهم.

  • اضافه کردن(خط سبز). طراحی شده برای افزودن یک فیلد جدید با استفاده از ویرایشگر بیان آزاد.
  • تغییر عنصر فعلی(خط قرمز). به شما امکان می دهد فیلد انتخابی را با استفاده از ویرایشگر تغییر دهید.
  • جریان را حذف کنید(خط آبی). فیلد انتخاب شده را از لیست حذف می کند.

قسمت عملی درس شماره 1

ما به تئوری لازم برای تکمیل تکلیف ارائه شده در این درس پرداخته ایم. بگذارید به شما یادآوری کنم که چگونه به نظر می رسد: یک درخواست به فهرست نامگذاری بنویسید، کل نامگذاری فهرست را انتخاب کنید.

بیایید شروع به ایجاد یک درخواست برای موارد کنیم:

  • بیایید یک درخواست جدید ایجاد کنیم و سازنده را با استفاده از روش مشخص شده در ابتدای درس باز کنیم.
  • در فصل پایگاه داده، بیایید یک تاپیک باز کنیم دایرکتوری هاو ما یک راهنما در آنجا پیدا خواهیم کرد نامگذاری؛
  • آن را انتخاب کنید و از دکمه ">" برای انتقال آن به بخش استفاده کنید جداول;
  • در فصل جداولدایرکتوری نامگذاری را با استفاده از نماد "+" باز کنید.
  • در لیست فیلدهایی که باز می شود، فیلد را پیدا کنید ارتباط دادنو آن را به بخش منتقل کنید زمینه هایبا استفاده از دکمه ">".
  • درخواست مورد آماده است، روی دکمه "OK" در پایین پنجره طراح کلیک کنید.

بیایید ببینیم آن چیست پرس و جوهای تو در تودر و چرا به آنها نیاز است.
اغلب موقعیتی وجود دارد که چندین عمل متوالی باید روی یک میز انجام شود. یک مثال نسبتاً گویا زمانی است که ابتدا نیاز دارید، و سپس شرایطی را بر روی یک جدول گروه بندی شده اعمال می کنید، یا آن را به جدول دیگری متصل می کنید. در چنین مواقعی به کمک می آیند پرس و جوهای تو در تو.

یک پرس و جو تو در تو عملاً هیچ تفاوتی با یک پرس و جو معمولی ندارد. در داخل پرانتز قرار دارد و تقریباً تمام روش ها و عملکردهای زبان پرس و جو 1C در آن موجود است. و برای کوئری والد، تمام فیلدهای پرس و جوی فرعی موجود است.
ساختار اولیه ترین پرس و جوی تو در تو به این شکل است

SELECT FROM (SELECT FROM) AS NestedQuery

البته در این شکل استفاده از پرس و جوی تو در تو معنی ندارد، زیرا می‌توانید فوراً فیلدهای مورد نیاز را بدون استفاده از تودرتو انتخاب کنید. همه چیز در اینجا برای سهولت درک بسیار ساده شده است.

حال بیایید با استفاده از یک مثال به تمام موارد بالا نگاه کنیم.
اجازه دهید یک جدول EmployeesDivisions داشته باشیم:

و ما می خواهیم از این جدول تمام بخش هایی را انتخاب کنیم که بیش از یک کارمند در آنها کار می کنند.

SELECT EmployeesDivisions.Division AS Division, NUMBER(EmployeesDivisions.Employee) AS Number ofEmployees FROM EmployeesDivisions AS EmployeesDivisions GROUP BY EmployeesDivisions.Division

اگر این کوئری را اجرا کنیم، در نتیجه جدول زیر را دریافت خواهیم کرد

مرحله دوم این است که محدودیتی برای تعداد کارمندان در این جدول اعمال کنید. برای این کار کوئری فوق را به صورت تودرتو در می آوریم و شرط مربوطه را در کوئری بالاتر می نویسیم

SELECT NestedQuery.Unit AS Unit FROM (SELECT EmployeesUnits.Unit AS Unit, QUANTITY(EmployeesUnits.Employee) AS Number OfEmployees FROM EmployeesUnits AS EmployeesUnits GROUP BY EmployeesQemberUnits.United es > 1

بنابراین نتیجه پرس و جو نهایی به صورت زیر خواهد بود

برای منصفانه بودن، شایان ذکر است که با استفاده از تابع می توان به همان نتیجه رسید داشتنزبان پرس و جو 1C و همچنین استفاده از جداول موقت.
در عمل، مطمئناً با پرس و جوهای تودرتو پیچیده تری مواجه خواهید شد که می توانند از جداول و جداول استفاده کنند. همچنین می تواند چندین سطح از تودرتو وجود داشته باشد.

تصمیم گرفتم سهم خود را داشته باشم و آن ویژگی های زبان را که در مقاله های بالا مورد بحث قرار نگرفتند، شرح دهم. هدف این مقاله توسعه دهندگان مبتدی است.

1. طراحی "IZ".

برای به دست آوردن داده ها از پایگاه داده، استفاده از ساختار "FROM" به هیچ وجه ضروری نیست.
مثال: ما باید تمام اطلاعات مربوط به بانک ها را از فهرست بانک ها انتخاب کنیم.
درخواست:

SELECT Directory.Banks.*

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

SELECT Banks.* FROM Directory.Banks AS Banks

2. ترتیب داده ها بر اساس فیلد مرجع

هنگامی که ما نیاز به سازماندهی داده های پرس و جو بر اساس انواع ابتدایی داریم: "String"، "Number"، "Date"، و غیره، در این صورت همه چیز با استفاده از ساختار "ORDER BY" حل می شود اگر نیاز به ترتیب داده ها بر اساس فیلد مرجع دارید؟ فیلد مرجع یک پیوند است، یک شناسه منحصر به فرد، یعنی. به طور کلی، برخی از مجموعه دلخواه شخصیت ها و ترتیب معمولی ممکن است نتیجه ای ایجاد کند که کاملاً مورد انتظار نیست. برای سفارش فیلدهای مرجع، از ساختار "AUTO ORDER" استفاده می شود. برای انجام این کار، ابتدا باید داده ها را مستقیماً بر اساس نوع مرجع با استفاده از ساختار "ORDER BY" و سپس ساختار "AUTO ORDER" مرتب کنید.

در این مورد، برای اسناد، سفارش به ترتیب "تاریخ> شماره"، برای کتاب های مرجع در "نمای اصلی" انجام می شود. اگر ترتیب توسط فیلدهای مرجع انجام نمی شود، استفاده از ساختار "AUTO ORDER" توصیه نمی شود.

در برخی موارد، ساختار "AUTO ORDER" می تواند روند انتخاب را کند کند. به روشی مشابه، می‌توانید بدون سفارش خودکار برای اسناد بازنویسی کنید:

3. به دست آوردن یک نمایش متنی از نوع مرجع. طراحی "PRESENTATION".

هنگامی که نیاز به نمایش یک فیلد از نوع مرجع دارید، به عنوان مثال، فیلد "بانک"، که پیوندی به عنصری از فهرست "بانک ها" است، باید بدانید که هنگام نمایش این فیلد، یک درخواست فرعی به " دایرکتوری Banks" به طور خودکار برای به دست آوردن نمای دایرکتوری اجرا می شود. این امر باعث کاهش سرعت خروجی داده می شود. برای جلوگیری از این امر، باید از ساختار "PRERESENTATION" در درخواست استفاده کنید تا فوراً نمایشی از شی را بدست آورید و سپس آن را برای مشاهده نمایش دهید.

در سیستم ترکیب داده، این مکانیسم به طور پیش فرض استفاده می شود، اما هنگام ایجاد طرح بندی در سلول ها، باید نمایش فیلد مرجع را مشخص کنید و مثلاً خود پیوند را در رونوشت قرار دهید.

4. شرایط برای نمونه گیری داده ها بر اساس یک الگو.

به عنوان مثال، شما باید تلفن های همراه کارمندان فرم (8 -123-456-78-912) را دریافت کنید. برای انجام این کار، باید شرایط زیر را در درخواست تنظیم کنید:

Employee.Name, Employee.Phone AS Phone FROM Directory.Employees AS Employees WHERE Phone LIKE "_-___-___-__-__"

کاراکتر "_" یک کاراکتر خدماتی است و جایگزین هر کاراکتری می شود.

5. استفاده همزمان از مجموع و گروه بندی.


مجموع ها اغلب همراه با گروه بندی ها استفاده می شوند.

ارائه خدمات. خدمات. نتایج نامگذاری توسط GENERAL، سازمان، nomenklatura

در این حالت، پرس و جو تقریباً مانند پرس و جو زیر برمی گردد:

SELECT Provision of Services.Organization AS Organization, Provision of Services.Nomenclature AS Nomenclature, Provision of Services.Amount of Document AS Amount of Document FROM Document.Provision of Services AS Provision of Services Results AMOUNT (Amount of Document) BY GENERALER نامگذاری

فقط اولین پرس و جو رکوردهای دارای نامگذاری مشابه را جمع می کند.

6. عدم ارجاع فیلدها.

ارجاع به فیلدها از طریق نقطه، عملیات عدم ارجاع فیلد مرجع نامیده می شود. مثلا پرداخت.سازمان.واحد اداری. در این صورت در فیلد مرجع «سازمان» سند «پرداخت» به جدول دیگری «سازمان ها» اشاره می کند که در آن مقدار ویژگی «واحد اداری» به دست می آید. درک این نکته مهم است که هنگام دسترسی به فیلدها از طریق یک نقطه، پلتفرم به طور ضمنی یک زیرپرسی ایجاد می کند و به این جداول می پیوندد.

درخواست:

می توان به صورت زیر نمایش داد:

Payment.Link، Payment.Organization، Payment.Organization، Organizations را انتخاب کنید. AdministrativeUnit FROM Document.Payment AS Payment LEFT JOIN Directory.Organizations AS Organizations Software Payment.Organization = Organizations.Link

هنگام عدم ارجاع فیلدهای مرجع از نوع ترکیبی، چارچوب تلاش می کند تا اتصال ضمنی به تمام جداول که بخشی از نوع آن فیلد هستند ایجاد کند. در این صورت، پرس و جو بهینه نخواهد بود، اگر به وضوح مشخص شود که چه نوع فیلدی است، لازم است که این گونه فیلدها را با یک ساختار محدود کنیم بیان().

به عنوان مثال، یک ثبت انباشت "پرداخت های توزیع نشده" وجود دارد که در آن چندین سند می توانند به عنوان یک ثبت کننده عمل کنند. در این مورد، به دست آوردن مقادیر جزئیات ثبت کننده به این روش نادرست است:

SELECT UnallocatedPayments.Register.Date, ..... FROM RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

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

SELECT EXPRESS(UnallocatedPayments.Register AS Document.Payment).Date, ..... FROM RegisterAccumulation.UnallocatedPayments AS UnallocatedPayments

7. ساخت و ساز "WHERE"

با اتصال سمت چپ دو جدول، وقتی شرط "WHERE" را روی جدول سمت راست اعمال می کنید، نتیجه ای مشابه نتیجه با اتصال داخلی جداول به دست می آوریم.

مثال. لازم است همه مشتریان از دایرکتوری مشتریان انتخاب شوند و برای آن دسته از مشتریانی که سند پرداخت با مقدار مشخصه "سازمان" = &سازمان دارند، سند "پرداخت" را نمایش دهند، برای کسانی که ندارند، آن را نمایش ندهند.

نتیجه پرس و جو سوابق را فقط برای آن دسته از مشتریانی که پرداخت توسط سازمان را در پارامتر داشتند برمی گرداند و سایر مشتریان را فیلتر می کند. بنابراین، ابتدا باید تمام پرداخت‌های سازمان «فلان» را در یک جدول موقت دریافت کنید و سپس آن را با استفاده از اتصال چپ به فهرست «مشتریان» متصل کنید.

SELECT Payment.Link AS Payment, Payment.Sareholder AS Client PLACE toPayments FROM Document.Payment as Payment WHERE Payment.Branch = &Branch; ////////////////////////////////////////////////// ////////////////////////// SELECT Clients.Link AS Client, ISNULL(tPayment.Payment, "") AS Payment FROM Directory .Clients AS Clients LEFT CONNECTION toppayments AS toppayments SOFTWARE Clients.Link = topayments.Client

شما می توانید این وضعیت را به روش دیگری دور بزنید. لازم است که شرط "WHERE" را مستقیماً بر رابطه بین دو جدول اعمال کنید. مثال:

SELECT Clients.Link, Payment.Link FROM Directory.US_Subscribers AS US_Subscribers LEFT CONNECTION Document.Payment AS Software Payment (Clients.Link = Payment.Client AND Payment.Client.Name LIKE "Sugar Packet,ClientsLiment.Client.LinkY) Client.LinkY ارتباط دادن

8. با جداول تودرتو و مجازی می پیوندد

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

به عنوان مثال، ما باید مبلغ موجودی را از تاریخ فعلی برای برخی از مشتریان دریافت کنیم.

SELECT UnallocatedPaymentsBalances.Customer, UnallocatedPaymentsBalances.AmountBalance FROM (SELECT Clients.Link AS Link FROM Directory.Clients AS Clients WHERE Clients.Link IN(&Clients)) AS NestedQuery RegisterAlocatedAloculations yments BY Nested nyRequest.Link = UnallocatedPaymentsBalances. مشتری

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

SELECT Clients.Link AS Link PLACE tClients FROM Directory.Clients AS Clients WHERE
Clients.Link B (&Clients) ; ////////////////////////////////////////////////// ////////////////////////// SELECT tClients.Link، UnallocatedPaymentsRemains.AmountRemaining، FROM tClients به عنوان tClients چپ پیوستن به RegisterAcumulations.UnallocatedPayments.Balances. IN (انتخاب tClients.Link FROM tClients)) AS UnallocatedPaymentsBalances tClients.Link = UnallocatedPaymentsBalances.Clients

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

جداول مجازی ، به شما امکان می دهد تا داده های عملاً آماده را برای اکثر وظایف کاربردی به دست آورید (Slice of the First, Slice of the Last, Remains, Turnovers, Remains and Turnovers) کلمه کلیدی در اینجا مجازی است. این جداول فیزیکی نیستند، اما توسط سیستم در پرواز جمع‌آوری می‌شوند، یعنی. هنگام دریافت داده ها از جداول مجازی، سیستم داده ها را از جداول ثبت نهایی جمع آوری، جمع آوری، گروه بندی و برای کاربر صادر می کند.

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

SELECT Clients.Link AS Link PLACE tClients FROM Directory.Clients AS Clients INDEX BY Link WHERE
Clients.Link B (&Clients) ; ////////////////////////////////////////////////// ////////////////////////// SELECT UnallocatedPayments.AmountBalance, UnallocatedPayments.Client AS Client PLACE موجودی FROM RegisterAccululations.UnallocatedPayments.Balances(, Client B ( پیوند tClients را از tClients انتخاب کنید. ////////////////////////////////////////////////// ////////////////////////// SELECT tClients.Link, toRemainders.AmountRemaining AS AmountRemaining FROM tClients AS tClients چپ به Remainders AS Remainders BY tClients JOIN. = tRemainings.Client

9. بررسی نتیجه درخواست.

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

ResRequest = Request.Execute(); اگر resQuery.Empty() سپس Return کنید. endIf;

روش خالی()باید قبل از روش ها استفاده شود انتخاب کنید()یا تخلیه ()، از آنجایی که بازیابی مجموعه به زمان نیاز دارد.

این برای کسی آشکار نیست که استفاده از پرس و جو در یک حلقه بسیار نامطلوب است. این می تواند به شدت بر زمان عملکرد یک عملکرد خاص تأثیر بگذارد. دریافت تمام داده های موجود در درخواست و سپس پردازش داده ها در یک حلقه بسیار مطلوب است. اما گاهی اوقات مواردی وجود دارد که انتقال درخواست به خارج از حلقه غیرممکن می شود. در این حالت برای بهینه سازی می توانید ایجاد کوئری را به خارج از حلقه منتقل کنید و در حلقه، پارامترهای لازم را جایگزین کرده و کوئری را اجرا کنید.

درخواست = درخواست جدید; Query.Text = "انتخاب | Clients.Link، | Clients.Birthdate |FROM | Directory.Clients AS Clients |WHERE | Clients.Link = &Client"; برای هر ردیف از TableClients حلقه Query.SetParameter("Client", Client); QueryResult = Query.Execute().Select(); چرخه پایان

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

11. ساخت و ساز "داشتن".

طرحی که در درخواست ها بسیار نادر است. به شما امکان می دهد شرایطی را بر روی مقادیر توابع کل (SUM، MINIMUM، AVERAGE و غیره) اعمال کنید. به عنوان مثال، شما باید فقط مشتریانی را انتخاب کنید که مبلغ پرداختی آنها در سپتامبر بیش از 13000 روبل بود. اگر از شرط "WHERE" استفاده می کنید، ابتدا باید یک جدول موقت یا یک پرس و جوی تودرتو ایجاد کنید، رکوردها را بر اساس مبلغ پرداختی در آنجا گروه بندی کنید و سپس شرط را اعمال کنید. ساخت و ساز "HAVING" به جلوگیری از این امر کمک می کند.

SELECT Payment.Customer, AMOUNT(Payment.Amount) AS Amount FROM Document.Payment As Payment WHERE MONTH(Payment.Date) = 9 GROUP BY Payment.Customer HAVING AMOUNT(Payment.Amount) > 13000

در سازنده، برای انجام این کار، فقط به تب "شرایط" بروید، یک شرط جدید اضافه کنید و کادر "Custom" را علامت بزنید. بعد فقط بنویس مبلغ (پرداخت. مبلغ) > 13000


12. مقدار NULL

من در اینجا اصول منطق سه ارزشی را در پایگاه داده توضیح نمی دهم، مقالات زیادی در مورد این موضوع وجود دارد. فقط به طور خلاصه در مورد چگونگی خالیممکن است بر نتیجه پرس و جو تأثیر بگذارد. مقدار NULL در واقع یک مقدار نیست و این واقعیت که مقدار تعریف نشده است ناشناخته است. بنابراین، هر عملیات با NULL، NULL را برمی گرداند، خواه جمع، تفریق، تقسیم یا مقایسه باشد. یک مقدار NULL را نمی توان با یک مقدار NULL مقایسه کرد زیرا ما نمی دانیم چه چیزی را مقایسه کنیم. آن ها هر دوی این مقایسه ها عبارتند از: NULL = NULL، NULL<>NULL درست یا نادرست نیست، ناشناخته است.

بیایید به یک مثال نگاه کنیم.

برای آن دسته از مشتریانی که پرداختی ندارند، باید فیلد "Sign" را با مقدار "بدون پرداخت" نمایش دهیم. علاوه بر این، ما مطمئناً می دانیم که چنین مشتریانی داریم. و برای انعکاس ماهیت آنچه در بالا نوشتم، بیایید این کار را به این صورت انجام دهیم.

"بدون پرداخت" را به عنوان مشخصه، تهی به عنوان پرداخت بالای سند در مکان انتخاب کنید. ////////////////////////////////////////////////// ///////////////////////// SELECT Clients.Link AS Client, Payment.Link How Payment PUT tClientPayment FROM Directory.Clients AS Clients LEFT CONNECTION Document. Payment AS نرم افزار پرداخت Clients.Link = Payment.Shareholder; ////////////////////////////////////////////////// ///////////////////////// انتخاب tClientPayment.Client FROM tClientPayment AS tClientPayment INTERNAL JOIN tPayment AS tTopay BY tClientPayment.Payment = tPayment

به دومین جدول موقت tClientPayment توجه کنید. با عضویت چپ، همه مشتریان و تمام پرداخت‌ها را برای این مشتریان انتخاب می‌کنم. برای آن دسته از مشتریانی که پرداختی ندارند، فیلد «پرداخت» NULL خواهد بود. طبق منطق، در اولین جدول موقت "tPayments" 2 فیلد را تعیین کردم، یکی از آنها NULL، خط دوم "پرداخت ندارد". در جدول سوم، جداول "tClientPayment" و "tPayment" را با استفاده از فیلدهای "Payment" و "Document" با یک اتصال داخلی به هم وصل می کنم. می دانیم که در جدول اول فیلد Document NULL است و در جدول دوم کسانی که پرداختی در قسمت Payment ندارند نیز NULL هستند. چنین ارتباطی چه چیزی را به ما باز خواهد گرداند؟ اما چیزی را برنمی گرداند. زیرا مقایسه NULL = NULL به True ارزیابی نمی شود.

برای اینکه درخواست نتیجه مورد انتظار را برگرداند، بیایید آن را بازنویسی کنیم:

"بدون پرداخت" را به عنوان ویژگی، VALUE(Document.Payment.EmptyLink) AS PLACE سند toPayments انتخاب کنید. ////////////////////////////////////////////////// ////////////////////////// SELECT Clients.Link AS Client, ISNULL(Payment.Link, VALUE(Document.Payment.EmptyLink)) How پرداخت PUT tClientPayment FROM Directory.Clients AS Clients LEFT CONNECTION Document.Payment AS Payment By Clients.Link = Payment.Shareholder; ////////////////////////////////////////////////// ///////////////////////// انتخاب tClientPayment.Client FROM tClientPayment AS tClientPayment INTERNAL JOIN tPayment AS tTopay BY tClientPayment.Payment = tPayment

حال در جدول موقت دوم مشخص کرده ایم که اگر قسمت “پرداخت” NULL باشد، این فیلد = یک لینک خالی به سند پرداخت است. در جدول First نیز NULL را با یک مرجع خالی جایگزین کردیم. اکنون اتصال شامل فیلدهای غیر NULL است و درخواست نتیجه مورد انتظار را برمی گرداند.

تمام درخواست های موجود در مقاله منعکس کننده موقعیت هایی است که می خواهم در نظر بگیرم و نه بیشتر. در باره آنها ممکن است هذیانی یا نابهینه نباشند، نکته اصلی این است که آنها ماهیت مثال را منعکس می کنند.

13. یک ویژگی غیرمستند طرح "انتخاب وقتی...آنگاه...پایان" است.

در مواردی که لازم است ساختار "شرایط" را در درخواست توصیف کنیم، از نحو استاندارد استفاده می کنیم:

SELECT SELECTION WHEN Users.Name = "Vasya Pupkin" THEN "کارمند مورد علاقه ما" ELSE "ما این را نمی دانیم" END AS Field1 FROM Directory.Users AS Users

اما اگر مثلاً در یک درخواست نیاز به دریافت نام ماه داشته باشیم، چه؟ نوشتن یک ساختار عظیم در یک درخواست زشت و وقت گیر است، بنابراین این شکل از نوشتن بالا می تواند به ما کمک کند:

SELECT MONTH(US_CalculationConsumption_TurnoverSchedule.CalculationPeriod) WHEN 1 سپس "ژانویه" WHEN 2 سپس "فوریه" WHEN 3 و سپس "مارس" WHEN 4 سپس "آوریل" WHEN 5 و سپس "مه" THENHENH 8 سپس "آگوست" هنگامی که 9 سپس "سپتامبر" هنگامی که 10 سپس "اکتبر" زمانی که 11 سپس "نوامبر" هنگامی که 12 سپس "دسامبر" به عنوان یک ماه تمام می شود

اکنون طراحی کمتر دست و پا گیر به نظر می رسد و به راحتی قابل درک است.

14. اجرای دسته ای یک درخواست.


برای اینکه درخواست ها چند برابر نشود، می توانید یک درخواست بزرگ ایجاد کنید، آن را به بسته ها تقسیم کنید و با آن کار کنید.
به عنوان مثال، من باید فیلدهای زیر را از فهرست "کاربران" دریافت کنم: "تاریخ تولد" و نقش های موجود برای هر کاربر. این را در قسمت های مختلف جدولی در فرم آپلود کنید. البته، شما می توانید این کار را در یک درخواست انجام دهید، سپس باید از طریق رکوردها تکرار کنید یا آنها را جمع کنید، یا می توانید این کار را انجام دهید:

SELECT Users.Link AS نام کامل، Users.تاریخ تولد، Users.Role PUT vtUsers FROM Directory.Users AS Users; ////////////////////////////////////////////////// ////////////////////////// انتخاب tueUsers.نام کامل، tueUsers.تاریخ تولد FROM tueUsers به ​​عنوان tueUsers گروه توسط tueUsers.نام کامل، tueUsers . تاریخ تولد؛ ////////////////////////////////////////////////// //////////////////////// انتخاب wUsers. نام کامل، wUsers. Role FROM wUsers AS wUsers GROUP BY wUsers. نام کامل، wUsers تولد

tPackage = Request.ExecutePackage();

TP_BirthDate = tPackage.Upload();
TP_Roles = tPackage.Unload();

همانطور که می بینیم، پرس و جو را می توان به صورت دسته ای اجرا کرد و نتیجه را می توان به عنوان یک آرایه پردازش کرد. در برخی موارد بسیار راحت است.

15. شرایط در یک درخواست دسته ای

به عنوان مثال، ما یک درخواست دسته‌ای داریم که ابتدا فیلدهای "نام، تاریخ تولد، کد" را از فهرست "کاربران" دریافت می‌کنیم و می‌خواهیم رکوردهایی را با شرایط این فیلدها از فهرست "افراد" دریافت کنیم.

SELECT Users.Individual.Name AS نام، Users.Individual.تاریخ تولد به عنوان تاریخ تولد، Users.Individual.Code AS Code PLACE vtUsers FROM Directory.Users AS Users; ////////////////////////////////////////////////// ////////////////////// SELECT Individuals از فهرست افراد

شما می توانید شرایطی مانند این را اعمال کنید:

WHERE Individuals.Code IN (SELECT tueUsers.Code FROM tueUsers) AND Individuals.Name IN (انتخاب tueUsers.Code FROM tueUsers) AND Individuals.BirthDate IN (انتخاب tueUsers.DateUsers از tue)

و شما می توانید این کار را به صورت زیر انجام دهید:

WHERE (Individuals.Code، Individuals.Name، Individuals.Date of Birth) IN (انتخاب tueUsers.Code، tueUsers.Name، tueUsers.Date of Birth FROM tueUsers)

علاوه بر این، حفظ نظم ضروری است.

16. فراخوانی سازنده پرس و جو برای "شرایط" در یک درخواست دسته ای

هنگامی که لازم است شرطی را اعمال کنید، مانند مثال بالا، می توانید فراموش کنید که این یا آن فیلد در جدول مجازی چه نامیده می شود.
به عنوان مثال، باید در قسمت "تاریخ تولد" شرطی قرار دهید و در جدول مجازی این فیلد "تاریخ تولد بدهکار" نامیده می شود و در صورت فراموش کردن نام، باید از ویرایش شرط خارج شوید. ذخیره کنید و به نام فیلد نگاه کنید. برای جلوگیری از این امر می توانید از تکنیک زیر استفاده کنید.

لازم است بعد از ساخت «B» براکت گذاشته شود و یک فضای خالی (فضا) بین براکت ها گذاشته، این فاصله را انتخاب کرده و سازنده query را فراخوانی کند. طراح به تمام جداول پرس و جو دسته ای دسترسی خواهد داشت. این تکنیک هم بر روی جداول ثبت مجازی و هم در تب "شرایط" کار می کند. در مورد دوم، باید کادر "P (شرط دلخواه)" را علامت بزنید و حالت ویرایش "F4" را وارد کنید.

پرس‌و‌جوها اغلب به‌سرعت مطرح می‌شدند و آنها صرفاً برای نشان دادن «تکنیک‌هایی» که من در نظر داشتم خدمت می‌کنند.

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

upd1. امتیاز 11،12
upd2. امتیاز 13،14،15،16

کتاب های مورد استفاده:
زبان پرس و جو "1C: Enterprise 8" - E.Yu. خروستالوا
توسعه حرفه ای در سیستم 1C: Enterprise 8."

دیدگاه ها