پرش به محتوای اصلی

پاک‌سازی و تغییر شکل داده‌ها در Power Query با Unpivot و Refresh

پاک‌سازی و تغییر شکل داده‌ها در Power Query با Unpivot و Refresh

پاک‌سازی و تغییر شکل داده‌ها در Power Query با Unpivot و Refresh یک راهنمای عملی برای حل مسئله‌ای تکرارشونده در محیط اکسل، اکسس و اتوماسیون اداری است. گزارش شعبه‌ها ستون‌های ماهانه متعدد دارد؛ باید سطرهای اضافی حذف، فاصله‌های ناخواسته اصلاح و ستون‌های ماه به دو ستون ماه و مبلغ تبدیل شوند. در این راهنما از تعریف مسئله و آماده‌سازی داده شروع می‌کنیم، اجرای نمونه را مرحله‌به‌مرحله توضیح می‌دهیم و در پایان نتیجه، خطاهای محتمل و روش انتقال به یک فرایند واقعی را بررسی می‌کنیم. هدف فقط آشنایی با نام دستور نیست؛ باید بتوانیم خروجی را اندازه بگیریم، علت اختلاف را پیدا کنیم و تغییرات بعدی را بدون از دست‌دادن کنترل انجام دهیم.

تصویر مفهومی برای پاک‌سازی داده‌ها در Power Query با نمودارها و عناصر آموزشی بدون متن

مسئله و هدف آموزشی

گزارش شعبه‌ها ستون‌های ماهانه متعدد دارد؛ باید سطرهای اضافی حذف، فاصله‌های ناخواسته اصلاح و ستون‌های ماه به دو ستون ماه و مبلغ تبدیل شوند.

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

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

پیش‌نیازها و فرض‌های فنی

Power Query در نسخه رومیزی اکسل یک لایه تبدیل داده است؛ مراحل آن در فهرست Applied Steps ثبت می‌شوند و با Refresh دوباره روی منبع اجرا خواهند شد. بنابراین انجام یک‌باره عملیات با نوشتن یک چرخه تکرارپذیر تفاوت دارد. برای منابع حجیم، ابتدا داده غیرضروری را حذف کنید تا هم نمایش پیش‌نمایش سبک‌تر شود و هم بررسی نتیجه ساده‌تر باشد. منبع را بدون نیاز واقعی با گزینه‌های تغییر داده جایگزین نکنید.

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

نکته دیگر، نگهداری بلندمدت است. کدی که امروز برای یک فایل جواب می‌دهد ممکن است با تغییر نام شیت، افزودن یک ستون یا ارتقای نسخه Office از کار بیفتد. بهتر است فرض‌های مهم در ابتدای آموزش و در کنار کد نوشته شوند. اگر فرض‌ها برقرار نبودند، توقف همراه با پیام روشن بهتر از ادامه دادن و تولید یک گزارش ناقص است. مستند کوتاهِ ورودی، خروجی و محدودیت‌ها معمولاً از پیچیده‌ترین ترفندهای فنی سودمندتر است.

مراحل پیاده‌سازی

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

نسخه خام و قابل بازسازی را نگه دارید

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

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

ردیف‌های عنوان تکراری و خالی را حذف کنید

در این گام: قبل از فیلتر، بررسی کنید کدام ردیف‌ها سربرگ تکراری یا جمع کل هستند؛ حذف کورکورانه سطرها امکان از دست رفتن داده معتبر دارد. این کار را ابتدا روی داده آزمایشی انجام دهید و قبل از ورود به گام بعد نتیجه را با ورودی کنترل کنید.

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

نوع ستون‌های کلیدی را مشخص کنید

در این گام: ستون Branch را متن بگذارید؛ از تبدیل شماره شناسایی به Number خودداری کنید، چون صفرهای آغازین حذف می‌شوند. این کار را ابتدا روی داده آزمایشی انجام دهید و قبل از ورود به گام بعد نتیجه را با ورودی کنترل کنید.

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

ستون‌های شناسایی را ثابت نگه دارید

در این گام: نام شعبه و شناسه را در فهرست ستون‌های ثابت قرار دهید تا Unpivot فقط ستون‌های ماهانه را به ردیف تبدیل کند. این کار را ابتدا روی داده آزمایشی انجام دهید و قبل از ورود به گام بعد نتیجه را با ورودی کنترل کنید.

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

ستون‌های ماه را Unpivot کنید

در این گام: با Unpivot Other Columns، ستون‌های ماه به دو فیلد Attribute و Value تبدیل می‌شوند. نام آن‌ها را Month و Amount بگذارید. این کار را ابتدا روی داده آزمایشی انجام دهید و قبل از ورود به گام بعد نتیجه را با ورودی کنترل کنید.

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

جدول نتیجه و Refresh را با داده تازه کنترل کنید

در این گام: بعد از Refresh، برای هر شعبه تعداد ماه‌های منبع را با تعداد ردیف خروجی و مجموع مبلغ مقایسه کنید. این کار را ابتدا روی داده آزمایشی انجام دهید و قبل از ورود به گام بعد نتیجه را با ورودی کنترل کنید.

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

مثال عملی و بررسی کد

برای روشن‌شدن ساختار پاک‌سازی داده‌ها در Power Query، کد زیر یک الگوی قابل تغییر ارائه می‌کند. قبل از اجرا، نام جدول‌ها و فایل‌ها را مطابق محیط آزمایشی خود تنظیم کنید. در مثال‌های VBA، کد باید داخل ماژول استاندارد و فایل سازگار با ماکرو قرار گیرد؛ در Power Query کد M در Advanced Editor و در فرمول‌های اکسل عبارت در سلول مناسب نوشته می‌شود.

let
 Source = Excel.CurrentWorkbook(){[Name="MonthlySales"]}[Content],
 Types = Table.TransformColumnTypes(Source, {{"Branch", type text}}),
 Clean = Table.TransformColumns(Types, {{"Branch", each Text.Trim(_), type text}}),
 Unpivoted = Table.UnpivotOtherColumns(Clean, {"Branch"}, "Month", "Amount"),
 Numeric = Table.TransformColumnTypes(Unpivoted, {{"Amount", type number}}),
 Result = Table.SelectRows(Numeric, each [Amount] <> null)
in Result

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

کنترل صحت و آزمون شرایط مرزی

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

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

در M، ترتیب مراحل و نوع هر ستون اهمیت دارد. متنی که ظاهر عددی دارد لزوماً Number نیست و تاریخ‌های محلی نیز ممکن است با فرهنگ اشتباه تفسیر شوند. بهتر است تبدیل نوع داده پس از تمیزکردن متن و در نقطه‌ای انجام شود که بتوانید خطاهای تبدیل را ببینید. شمار ردیف‌های دارای Error را کنترل کنید؛ حذف همه خطاها بدون تحلیل می‌تواند مقدار مالی معتبر را از گزارش کنار بگذارد.

خطاهای رایج

نشانه یا خطربررسی و راه‌حل
Unpivot Other Columns برای اضافه‌شدن ماه‌های تازه انعطاف دارد، اما ستون شناسایی جدید اگر به‌اشتباه اضافه شود باید آگاهانه مدیریت شود.قبل از تکرار اجرای اصلی، فایل آزمایشی را بررسی کنید، مقدارهای ورودی را ثبت و گام 1 را مستقل اجرا کنید. حذف خطا بدون یافتن علت ممکن است نتیجه را ناقص کند.
تبدیل تاریخ و عدد به تنظیمات منطقه‌ای حساس است؛ نتیجه را با چند رکورد واقعی کنترل کنید.قبل از تکرار اجرای اصلی، فایل آزمایشی را بررسی کنید، مقدارهای ورودی را ثبت و گام 2 را مستقل اجرا کنید. حذف خطا بدون یافتن علت ممکن است نتیجه را ناقص کند.
نوع داده با محاسبه یا فیلتر سازگار نیست.نوع ستون و نمونه مقدار را پیش از ادامه کنترل کنید.
رکوردهای جدید نتیجه را تغییر داده‌اند و کنترل قبلی معتبر نیست.شمار سطرها و جمع کنترل را مجدداً محاسبه کنید.

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

بهترین روش‌ها و نگهداری

Power Query فرمولی نیست که با تغییر هر سلول فوراً همه خروجی‌ها را محاسبه کند. باید Refresh اجرا شود و در برخی محیط‌ها تنظیمات بارگذاری یا اجازه دسترسی به فایل‌ها هم اهمیت دارد. اگر کاربر فایل نهایی را جابه‌جا کند، مسیر پوشه در کوئری ممکن است بشکند. قبل از تحویل گزارش، مسیر داده و نسخه پشتیبان را ثبت کنید و روی یک فایل تازه، فرایند بازیابی را آزمایش کنید.

نکته دیگر، نگهداری بلندمدت است. کدی که امروز برای یک فایل جواب می‌دهد ممکن است با تغییر نام شیت، افزودن یک ستون یا ارتقای نسخه Office از کار بیفتد. بهتر است فرض‌های مهم در ابتدای آموزش و در کنار کد نوشته شوند. اگر فرض‌ها برقرار نبودند، توقف همراه با پیام روشن بهتر از ادامه دادن و تولید یک گزارش ناقص است. مستند کوتاهِ ورودی، خروجی و محدودیت‌ها معمولاً از پیچیده‌ترین ترفندهای فنی سودمندتر است.

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

تمرین پیشنهادی

یک نسخه کوچک از مسئله «پاک‌سازی و تغییر شکل داده‌ها در Power Query با Unpivot و Refresh» برای تمرین بسازید. سه ورودی تازه اضافه کنید: یک رکورد معتبر، یک رکورد تکراری و یک رکورد دارای مقدار گمشده. پیش از اجرا، خروجی مورد انتظار هر سه را در جدول جداگانه بنویسید. سپس فرایند را اجرا کنید و تفاوت‌ها را کنار هم ثبت کنید. پس از موفقیت، نام یکی از ستون‌ها یا مسیر یکی از فایل‌ها را عمداً تغییر دهید تا رفتار خطا را هم ببینید. در پایان، مراحل لازم برای بازگرداندن وضعیت صحیح را مستند کنید.

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

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

موضوعات مرتبط

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

پرسش‌های متداول

پاک‌سازی داده‌ها در Power Query: چه مسئله‌ای با این روش حل می‌شود؟

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

پیش از اجرا چه چیزی را باید کنترل کنیم؟

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

اگر داده ناقص باشد چه اتفاقی می‌افتد؟

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

چگونه درستی نتیجه را اثبات کنیم؟

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

آیا این روش برای گزارش‌های واقعی مناسب است؟

این روش برای مسئله‌ای مناسب است که بتوان ورودی و خروجی آن را دقیق تعریف کرد. گزارش شعبه‌ها ستون‌های ماهانه متعدد دارد؛ باید سطرهای اضافی حذف، فاصله‌های ناخواسته اصلاح و ستون‌های ماه به دو ستون ماه و مبلغ تبدیل شوند. در عمل باید ابتدا «ستون‌های ماه را Unpivot کنید» را کنترل و سپس نمونه‌ای از داده درست و نادرست را مقایسه کرد. اگر نتیجه با انتظار تفاوت دارد، لازم نیست کل برنامه بازنویسی شود؛ همان مرحله‌ای را که اختلاف در آن ظاهر شده جداگانه اجرا کنید. این شیوه هم برای آموزش و هم برای نگهداری بعدی قابل اعتمادتر است.

جمع‌بندی

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

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

تأیید امنیتی هنگام تعامل با فرم بارگذاری می‌شود.