Writes data from a variable to a disk file.
نوشتن داده از یک متغیر یه یک فایل
نوشتاری عبارت Put :
Put [ # ] filenumber, [ recnumber ], varname
طبق نوشتار بالا این عبارت سه قسمت دارد که شماره فایل ( 1 تا 255 ) و نام متغیر ضروری هستند و فقط شماره رکورد Optional یا می تواند خالی رها شود.
دیتا نوشته شده با Put معمولا با Get خوانده می شود
رکورد یا بایت اول در یک فایل در موقعیت 1 ، رکورد یا بایت دوم در پوزیشن 2 و .... است . اگر recnumber را نادیده بگیرید( omit ) ، رکورد یا بایت بعدی بعد از آخرین عبارت یا دستور Get یا Put ، یا با آخرین تابع Seek اشاره شده ، نوشته می شود. باید در جداکننده کاما قرار گیرند مثال :
Put #1,,FileBuffer
برای فایل هایی که در حالت تصادفی یا Random Mode باز ( Open ) می شوند قوائد زیر اعمال می گردد :
اگر طول دیتای در حال نوشتن کمتر از طول مشخص شده در عبارت Len دستور Open باشد ، Put رکوردهای بعدی را روی مرزهای طول رکورد می نویسد فضای بین پایان رکورد و ابتدای رکورد بعدی با محتویات موجود در بافر پر می شود. از آنجاییکه مقدار data padding را نمی توان با قطعیت پیدا کرد ، بطور کلی ایده خوبی است که طول رکورد با طول داده های نوشته شده مطابقت داشته باشد.اگر طول داده های نوشته شده بیشتر ازطول مشخص شده در عبارت Len دستور Open باشد ، خطائی رخ می دهد. اگر متغیری که نوشته می شود یک رشته بت طول متغیر باشد ، Put یک توصیفگر 2 بایتی می نویسد که شامل طول رشته و سپس متغیر است . طول رکورد مشخص شده توسط Len در دستور Open باید حداقل 2 بایت بیشتر از طول واقعی رشته باشد.... هر کاراکتر یک بایت است ( شامل ۷ یا ۸ بیت ).
اگرمتغیری ( Variable ) که نوشته می شود یک Variant از نوع عددی باشد ( وقتی بعنوان واریانت مشخص می کنید تمام دیتا تایپ ها راشامل میشود حتی یک Variant نال هم می تواند باشد ولی آبجکت خیر ) Put دو بایت می نویسد ( هرکاراکتر یک بایت ) که VarType را مشخص میکند و سپس متغیر را می نویسد. بعنوان مثال هنگام نوشتن یک Variant از VarType 3 دستور Put شش بایت می نویسد : دو بایت که با آن متغیر شناسایی می شود و چهار بایت حاوی داده ( Long ) . طول رکورد مشخص شده توسط Len دستور Open باید حداقل دو بایت بیشتر از تعداد واقعی بایت های مورد نیاز برای ذخیره متغیر باشد.
اگر متغیری که نوشته می شود یک Variant از VarType 8 یا String باشد ، Put دو بایت می نویسد که VarType را مشخص میکند ، دو بایت که طول رشته را مشخص میکند و سپس دیتا رشته ای را می نویسد. طول رکورد مشخص شده در Len دستور Open باید حداقل چهار بایت بیشتر از طول واقعی رشته باشد. ( VarType یا Variable Type که یک تابع است برای فهمیدن نوع داده متغیر )
برای فایل های باز شده در حالت باینری مثل اتصال به دستگاه از طریق USB ( باز کردن پورت مثل COM1 تا COMn) ، تمام قوائد Random اعمال می شود جز :
بند Len در دستور یا عبارت Open هیچ تاثیری ندارد.Put تمام متغیرها را بطور پیوسته روی دیسک می نویسد بدون Padding بین رکوردها. برای هر آرایه ای غیر از آرایه در یک نوع user-defined ( توسط کاربر مشخص شده ) Put فقط دیتا را می نویسد . هیچ توصیفی نوشته نمی شود. Put رشته هایی با طول-متغیر که جزئی از انواع user-defined نیست را بدون 2 بایت طول توصیفگر می نویسد. تعداد بایت های نوشته شده برابر تعداد کاراکترها در رشته است . برای مثال عبارتهای زیر 10 بایت به فایل شماره یک می نویسد.
VarString$ = String$(10," ")
Put #1,,VarString$
می توان از دستورات AT COMMAND در PUT برای ارسال به PORT استفاده کرد
Get [ # ] filenumber, [ recnumber ], varname
Reads data from an open disk file into a variable.
varlist | Required. Comma-delimited list of variables that are assigned values read from the file—can't be an array or object variable. However, variables that describe an element of an array or user-defined type may be used. |
مجموعه ای ارزنده از دستورات ارتباطی گرد آوری شده از سایت ها
Communications
A tool to provide a visual means to send and receive data through serial ports
terminal_online_installer.exe
serial-port-terminal1.software
Split then Conant Concatenated_SMS
issues-with-concatenated-sms-pdu
"ATD+98913.....;"+Chr(13) ' Dial
ATD (Dial), ATA (Answer), ATH (Hook control) and ATO (Return to online data state), AT+CMGS (Send SMS message), AT+CMSS (Send SMS message from storage), AT+CMGL (List SMS messages) and AT+CMGR (Read SMS messages).
AT commands are instructions used to control a modem. AT is the abbreviation of ATtention. Every command line starts with "AT" or "at". That's why modem commands are called AT commands.
دستورالعمل هایی هستند که برای کنترل مودم استفاده می شوند . AT اختصار ATtention است. هر خط با AT یا at شروع می شود یعنی دستورات مودم AT commands نامیده می شوند.
Cell Phone Book Find :
AT+CPBF command is used to find the entries of the phone book
AT
OK
AT+CMGF=1
OK
AT+CMGW="+85291234567"
> A simple demo of SMS text messaging.
+CMGW: 1
OK
AT+CMSS=1
+CMSS: 20
OK
CMGW : Write To Storage
CMSS : Send message from storage
Contact Phone Book Read
AT+CPBR=1
</a>”>AT+CPBR=?
+CPBR: (1-100),40,25
OK
Chr(26) : Ctrl+Z
OpenSerialPort
dim StrInput as string * 11
Open "Com1:9600,n,8,1" for binary Access Read Write as #1
Put #1,,Chr(2)+"Hello World"+Chr(13)+Chr(26)
Sleep 100
ATD : Dial
ATH0
ATM0
D : Dial
H : Hang
L : Redials last number dialed
P : Pulse dial
T : Tone Dial
M0 : Speaker off
M1 : Speaker is on until a carrier detect
M2 : Speaker is always on
M3 : Speaker is on during answering only
بین هر دستور AT باید یک فاصله زمانی کوتاه باشد تا Ok را برگرداند.اگر fail دهد انجام نخواهد شد.
Example :
StringCmd="ATDT" & PhoneNumber & vbCrLf
Sleep 100
StringCmd="ATM1" & vbCrLf
Sleep 100
StringCmd="ATH0" & vbCrLf
ATDT = attention dial tone
ATH1 = attention pickup handset (you should hear a dial tone)
ATH0 = attention hang up
ATM1L3 = m is for speaker, l is for volume
ATM1L3 ، که در بالا گفته شد M برای بلندگو و L برای حجم صدا
DT : Tone dial
DP : Palse Dial
L0 : Volume Off
L1 : Volume low
L2 : Volume medium
L3 : Volume High
ATH0 : Hang Up ( go on-hook)
ATH1 : Pick Up ( go off-hook )
AT+CMGW: Used to store a message in the SIM. After the execution of the command, the ‘>’ sign appears in the next line where the message can be entered.
برای ذخیره پیام در SIM استفاده می شود.بعد از اجرای دستور ، علامت < در خط بعد ظاهر می شود که پیام آنجا وارد می گردد.یعنی اول شماره موبایل نوشته می شود بعد اینتر یا (Chr(13 یا vbcrlf و زمانیکه علامت بزرگتر ظاهر شده پیام Write می شود و بعد Crtl+Z یا (26)Chr ارسال می شود ، پس بین ارسال خط اول و نوشتن پیام باید یک فاصله کوتاه زمانی باشد اگر علامت < پیدا یا مشاهده نشد یعنی قادر به Write نیستید. نوشتار آن به روش زیر بیان شده
SYNTAX: AT+CMGW=” Phone number”> Message to be stored Ctrl+z
مطلب از سایت داخلی :
AT+CMGF فعال کردن مد TEXT یا PDU برای ارسال پیام کوتاه
Example:AT+CMGF=1 TEX MODE & AT+CMGF=0 PDU MODE
AT+CMGS ارسال پیام کوتاه
Example: AT+CMGS="0913222222"
AT+CMGR خواندن پیام کوتاه های ذخیره شده
Example:AT+CMGR=1 خواندن اولین پیام
AT+CNUM نمایش شماره تماس گیرنده
AT+GSMBUSY رد تماس دریافتی
PurgeComm empties the buffer without transmission or reception (its a delete basically)
پس ما داده را می بایست به بافری ( بافر حافظه ای در Ram برای ذخیره اطلاعات : موقت ) انتقال بدهیم ، این تابع Api بافر را بدون انتقال یا پذیرشی خالی می کند
بافرهای یک فایل مشخص را Flush می کند و باعث می شود تمام داده های بافر در یک فایل نوشته شوند.
A buffer flush is the transfer of computer data from a temporary storage area to the computer's permanent memory
Lib "Kernel32"
ارسال داده های محدوده انتخابی به تکست فایل :
"C:\Program Files (x86)\Webcam Surveyor\WebcamSurveyor.exe /capture"
/imgclose : take a snapshot img and close app
SMS PDU ( POCKET DATA UNIT ) :
Introduction to SMS PDU Mode. The PDU mode offers to send binary information in 7 bit or 8 bit format. ... The SMS message, as specified by the Etsi organization (documents GSM 03.40 and GSM 03.38), can be up to 160 characters long, where each character is 7 bits according to the 7-bit default alphabet.
معرفی : حالت PDU ارسال اطلاعات باینری را در قالب ۷ یا ۸ بیتی ارائه می دهد.. پیامک همانطور که توسط سازمان Etsi مشخص شده می تواند تا 160 کاراکتر طول داشته باشد ، هر کاراکتر ۷ بیت است طبق الفبای پیش فرض ۷ بیتی.
1 byte= 8 bits
پس هر کاراکتر ۷ یا 8 بیت یا یک بایت است
مطلب زیر هم جالبه در Encoding و Concat کردن ، در پیام های یونیکد ( منظور اینجا فارسی ) که طول رشته بیشتر از 67 است ( utf+16 ) و ماکزیمم ارسال در هر پارت 67 کاراکتر است البته جز تک پارت که 70 کاراکتر می شود ارسال کرد حداکثر 256×256 کاراکتر. کدینگ GSM ، جایگزینی را برای Ascii بسط داده و جدولش رو هم ذکر کرده و در حالت سنگل 160 کاراکتر می توان ارسال کرد برای چند پارتی 153 کاراکتر در هر پارت.
messaging-services/character-sets/
این Encoding شامل قسمت های مختلفی است
مرحله اول مشخص کردن مرکز پیام :
اول شماره موبایل بصورت دو رقم جدا شده اگر عددی فرد افتاد به آن F اضافه می شود و هر کدام برعکس می شود .اگر در اول شماره + ( بیانگر شماره بین المللی ) باشد 91 بجای مثبت جایگزین می شود در غیر اینصورت 81 ، بعد از جدا کردن و معکوس کردن هر دو رقم ، شمرده می شوند که نتیجه به اول عبارت اضافه نی شود مثال :
+98930=919830=91 8903=03 91 89 03=03918903
تابع می نویسید یا پراپرتی در نظر می گیرید که شماره رو بگیره یا چون مرکز پیام در گوشی مشخص است 001100 را بکار ببرید بجای اعمال شماره موبایل sender
قسمت دوم گزارش پیام :
عدد 31 برای موافق بودن و 11 برای عدم تمایل که به مرکز پیام اضافه می شود
قسمت رفرنس پیام :
فرضا پیام ذخیره ای شده ای را می خواهید بفرستید و چون ندارید اینکس 0 است و ندارید از 00 استفاده کنید.
قسمت شماره مقصد :
اگر مثبت جلوش باشه ( شماره بین المللی ) عدد 91 و در غیر اینصورت عدد 81 و اول ارقام بصورت تکی شمارش میشه ( مثل مرکز پیام نیست که دورقم جدا میشه و بعد شمارش ) یعنی اگر شماره شما معمولی باشد مثل 780 ... 0939 و تعداد کاراکتر آن 11 باشد میشود در نتیجه اول عدد هگزادسیمال قرار میگیرد ( شمارش کاراکتر ) و بعد عدد 81 و بعد اعداد موبایل که دو تا دوتا جدا شد برعکس می شود اگر عدد فردی در آخر ماند با F0 جمع می شود.مثلا اگر موبایل ورودی 09390000018 باشد چون معمولی است ( نقیشون ) عدد 81 را در نظر بگیرید فعلا ... تعداد کاراکتر موبایل 11 رقم است در نتیجه شمارهِ هگزادسیمال آن می شود B که چون باید دو رقم ذکر شود یک صفر قبل از آن می گذاریم و می شود 0B اگر دوازده رقم بود میشد 0C
09-39-00-00-01-8
0C819093000010F8
قسمت بعدی 00 قرار داده شود
قسمت بعد کاراکترها قرار می گیرند و طول در اول آن قرار می گیرد
09300000016 :
81-09-30-00-00-01-6
L : 07
81 90 03 00 00 10 F0+6
81 90 03 00 00 10 F6
مثال زیر از یونیکد 8 برای ارسال تکست استفاده کرده و CMGF یا فرمت باید تنظیم شود. 001100 از خود آن دستگاه که سیم نصب است ارسال می کند احتیاج به قید شماره سیم دستگاه نیست.
00
11
00
Reciever Number Len =0C (09390000018)
National = 81
Number =9093000010F8
PID=00
DCS ( Data Coding Scheme ) =08 Unicode 16 utf+16
Validity Period=AA : 4 Days , 2 Hours
UDL(Data Len)=08
06450648062F0628
0011000C819093000010F80008AA0806450648062F0628
حاوی ارسال کلمه مودب البته فقط 70 کاراکتر همراا با Space می فرستد که برای بیشتر از آن باید پارت پارت شود و هر کدام index ترتیبی میگیرد فرضا 01 و ....
online-sms-pdu-decoder/ < ----چک کنید
AT+CMGF=0 'Set PDU mode
AT+CSMS=0 'Check if modem supports SMS commands
AT+CMGS=23 'Send message, 23 octets (excluding the two initial zeros) '
>0011000B916407281553F80000AA0AE8329BFD4697D9EC37
Ctrl+Z Or Chr(26)
Character to Hex :
h ... Ascii code=104
104/16=6.5 ..... خارج قسمت برابر 6
mod(104,16)=8 ....(104-16×6)=8 ( باقیمانده تقسیم )
ascii(104) to Hexadecimal=68
hex(68) to ascii = 6×16^(1)+8×16^(0)=104
decimal number
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
hexa decimal number
1 2 3 4 5 6 7 8 9 A B C D E F
HEX(459) : تبدیل دسیمال به هگزادسیمال
459÷256=1 خارج قسمت
459-1×256=203
203÷16=12 خارج قسمت C
203-12×16=11 باقیمانده B
Decimal 459 = 1CB Hexadecimal
البته خود اکسس اینکار رو انجام میده احتیاجی به محاسبات یا نوشتن تابع نیست.
برای ارسال یونیکدها از utf+16 بهره می بریم و Dcs یا دیتا کد آن می شود 08 و می بایست دسیمال آن به هگزادسیمال تبدیل شود پس داریم :
HTML DECIMAL : حرف م عربی
6×16^(2)+4×16^(1)+5×16^(0)=1605
HTML HEX : 645
1605÷256=6 خارج قسمت
1605-6×256=69 مانده
69÷16=4 خارج قسمت
69-4×16=5 مانده
HTML DEC 1605 = HTML HEX 645
در ارسال دیتا حتما 645 به 0645 تبدیل شود
پس طبق فرمول بالا متوجه شدید که چطور می شود دسیمال را به هگزا و برعکس تبدیل کرد، فرضا در خواندن دیتا اگر هگز 0645 را دریافت کردید متوجه می شوید که اول صفر آن برداشته میشود و بعد از سمت راست عدد شروع به توان گذاری ترتیبی عدد 16 از صفر می کنید و در عدد مربوطه ضرب می شود.
0645=645=6×16^2+4×16^1+5×16^0=1605
Chrw(1605)=م
بازم احتیاج به نوشتن کد برای تبدیل هگزا 0645 به دسیمال 1605 نیست خود اکسس اینکار را انجام میدهد.کافیست قبلش "H&" بگذارید و ......
0011000B916407281553F80008AA0406450646
003100 شماره مرکز پیام
LEN=0B طول شماره ارسالی
National=81
Number Reverse 2 Digits=9003000010F7
(ارسال به شماره 09300000017 )
0B تعداد رقم ها می شود 12 و به هگزا
PID=00
DCS=08 Data Coding Unicode utf+16
Validity=AA اعتبار ۴ روز
UDL=02 طول دیتا
UD=0645
برای حالت ارسال در زمان و تاریخ خاص است که از time stamp می شود استفاده کرد.در لینک هایی که گذاشته شده مشخص است چک کنید.
AT+CMGS=15 ( از بعد از شماره مرکز شمارش دوتایی شروع می شود )
0691891901500001000B819003000010F70008020633
LEN=06
918919015000 : SMC +98110050
01
00
Len reciever=0B
Number=819003000010F7 : 9300000017
PID=00
DCS=08 کدینگ Utf+16
UDL=02 طول داده در زیر
UD=0633 س
AT+CMGS=16
With Validity : دو رقم بعد از 08 کدینگ
0691891901500011000B819003000010F700080B020633
PDU TYPE : SMS-SUBMIT
0031000B819003000010F700080B020633
0031000B819003000010F70008BB020633
مثالی دیگر از کد کردن برای ارسال :
برای ارسال حتما باید شماره ارقام دوتایی ارسال شود قبل از ارسال کدینگ که در پائین ترش آمده این شمارش دوتایی از همان 11 شروع می شود
AT+CMGS=38
06918919015000 حاوی شماره مرکز پیام
1100
0B819073000010F7 حاوی شماره گیرنده
00
08 کدینگ
0B مدت اعتبار پیامک
زیرین دو رقم اول حاوی طول رشته به کد ( هگزا ) ... طول خود رشته 12 است چون از کد html استفاده کردیم 12 را در 2 ضرب کردیم ( 0645 دورقم شمارش میشود 2 بیت ) شد 24 و خارج قسمت 24 به 16 و باقیمانده را کنار هم گذاردیم شد 18 و بعد از 18 هگزای هر کارکاتر به html بیان شده یعنی decimal هر کاراکتر به هگزادسیمال تبدیل شده.
1806330644062706450020062F06480633062A002006450646
سلام دوست من
SMSC#+9891100500 مرکز پیام
Receipient:09370000017 ارسال به موبایل
Validity:Rel 1h مدت یکساعت
TP_PID:00
TP_DCS:08 کدینگ
TP_DCS-popis:Uncompressed Text
No class
Alphabet:UCS2(16)bit
سلام دوست مم
Length:12 طول رشته بانضمام فاصله ها
حداکثر تا 70 کاراکتر در این حالت قابل ارسال است
AT+CMGS=46
0031000B819003000010F700080B20
06370631062D0020062C0647063400200645063306A9064600200645064406CC
Receipt requested
SMSC#
Receipient:09300000017
Validity:Rel 1h
TP_PID:00
TP_DCS:08
TP_DCS-popis:Uncompressed Text
No class
Alphabet:UCS2(16)bit
طرح جهش مسکن ملی
Length:16
کدینگ زیر برای ارسال متن یونیکد در تاریخ 29 دسامبر 2021 با درخواست تحویل پیام ( 24 )
فرمت PDU :
حروف الفبا ممکن است متفاوت باشند و چندین گزینه رمزگذاری هنگام نمایش پیامک وجود دارد رایج ترین آنها PCDN و PCCP437 و IRA و GSM و 8859-1 است . وقتی پیامکی را در یک برنامه رایانه ای می خوانید ، توسط دستور AT+CSCS تنظیم می شوند
ارسال پیامک در زمان موردنظر :
06918919015000240DD0E474D81C0EBB01000812218251000000020645
06918919015000000B819003000010F000812218251000000020645
Octal Number To Decimal
Oct : 150
1×8^(2)+5×8^(1)+0×8^(0)=104
ادغام پیامک ها ( بیشتر از 70 کاراکتر در یونیکدها :
0041000B819003000010F7
PID=00
DCD=08
LEN=08
050003000301 : 1/3
DATA=0645
Example of the UDH for an sms split into two parts:
UDH : DATA HEADER
CC : یک رفرنس است می توانید خودتان 00 یا 01 بگذارید
05 00 03 CC 01 02
05 00 03 CC 02 02
یک از دو و دو از دو تعداد در آخر آمده فرضا اگر در یونیکد تعداد کاراکتر بیش از 70 بود باید در دو پارت با رفرنس یکسان که CC نامگذاری شده ارسال گردد ولی زمان تحویل اینها Concatenate می شوند
05 00 03 CC 01 01 :UDH FOR SINGLE PART
در لینک زیر کاملا توضیح داده شده :
06918919015000
240B819003000010F7
0008122192515151000406450646
برای ارسال پیام به صورت دوپارتی :
"AT+CMGF=0"+Chr(13) ' Enter ...<CR>
"AT+CMGS=21"+Chr(13)
"0041000B819003000010F7000808050003CC02010645"+Chr(26) ' Ctrl+Z
"AT+CMGF=0"+Chr(13) ' Enter ...<CR>
"AT+CMGS=21"+Chr(13)
"0041000B819003000010F7000808050003CC02020646"+Chr(26) ' Ctrl+Z
در کد کردن بالا پیام به دو پارت تقسیم شد حرف م و ن را ارسال میکند البته در قالب یک پیامک از 004100 حتما استفاده شود در CMGS طول نوشته می شود بصورت دوتایی از 41 تا آخر که در اینجا 21 است
تماما تست شده با هایپر ترمینال و شماره مورد نظر دریافت نموده پس از صحت کدها مطمئن باشید.
در Encoding اسپلیت شده 004100 ثابت است و همینطور 050003 ( فقط باید یک رفرنس برای پیام مشخص کنید فرضا از 00 تا FF و برای هر پارت یکی باشد شماره موبایل عوض شد تغییر کند بالا CC فرض شد) و بعد تعداد کل پارت و شماره پارت تغییر می کند . شماره موبایل گیرنده را کد کنید . کاراکترها را 67 تا 67 تا جدا کنید ، فرضا تعداد کاراکترهای فارسی و غیره به انضمام Space هایی که بین حروف است 230 باشد پس می شود 4 پارت یعنی 3 پارت با طول 67 و یک پارت باطول 29 .... در 67 کاراکتر پارت اول لوپ بزنید و هگزادسیمال آنرا با تابع $Hex بگیرید همانطور که گفته شد باید به فرمت 0000 باشد( حتما اگر هگز 645 بود باید به فرمت 0645 در آید می توانید از تابع $ Format استفاده کنید ) بعد از اتمام طول آنرا بانضمام هدر آن که 01 03 00 03 00 05 ( بالا توضیح دادیم بعد از 03 عدد 00 رفرنس این چهار پارت است که در چهارپارت باید همین باشد و بعدی تعداد پارت ها و 01 نیز شماره پارت که یک است )
خلاصه مطلب بالا ، ابتدا طول رشته ی ارسالی با تابع Len گرفته می شود( برای پیام فارسی حداکثر طول رشته در هر پارت 67 است ) و سپس تعداد پارت های ارسالی مشخص میشود بعد در هر پارت لوپ زده میشود که هگزادسیمال آن بدست آید با فرمت 0000 و در نهایت به هدر که توضیج داده شده حاوی تعداد کل و شماره پارت است متصل شده و طول کل آن ( دوتا دوتا ) در اول آن قرار می گیرد و در نهایت به کدشده شماره گیرنده و ثابت 004100 می پیوندد و تعداد کل از 41 تا آخر بصورت دوتایی در CMGS قرار داده میشود. به ترتیب ارسال می شوند CMGS ، ارسال اینتر ، ارسال کدینگ انجام گرفته برای پارت اول ، ارسال کنترل + Z .... اگر طول رشته کمتر از 70 بید در هدر بجای تعداد کل 01 و بجای شماره پارت 01 لحاظ میشود 01 01 00 03 00 05 ، عدد 05 در اینجا طول هدر است .
تصویر زیر نمایی از استخراج Phone Book با دستور AT+CPBR=1,99 است ، 99 منظور تعداد است ممکن است در دفترچه شما 150 شماره موجود باشد لذا باید بجای 99 از 150 استفاده بنمائید
To Get Phone Book Data with Open Statement
AT+CMGL=ALL ' Message List
واقعا کم لطفیه اگر این مطالب استثنایی رو مطالعه کنید و در نظر سنجی شرکت
نکنید
کد نویسی در اکسس با دریافت مبلغ مربوطه فقط کدهای اکسسی نه script نویسی ، پروژه پذیرفته نمی شود و فقط در حد رفع مشکل. لطفا زیر همین پست مشکل در کد نویسی جهت رفع قرار داده شود شاید سایر دوستان نیز در رفع آن کمک بنمایند.
لطفا نظرسنجی فراموش نشود.
یا بسیجی ها بودند یا عناصر خودفروخته جهت تفرقه افکنی
ریاست محترم سازمان بهشت زهرا (ع)
جناب آقای غضنفری
با سلام
احتراماً از اقدامِ بهجا و دستور خردمندانه جنابعالی در پاکسازی آلودگیهای ناشی از قیرپاشیِ عوامل ناشناخته! بر سنگ مزار زندهیاد روحالله زم سپاسگزاری میگردد.
امید است برخورد شایستهٔ جنابعالی با این پدیده زشت ضد فرهنگی و منکر شرعی که برخی آن را ناشی از بدفهمی و متصف به «آتش به اختیار»ی میدانند و با این قبیل رفتارها، موجبات تشویش خاطرات شهروندان را فراهم مینمایند، در دیگر دستگاههای حاکمیت که مشکلساز «معاش و معاد» مردم گردیدهاند، تسری و تجلی یافته و زمینههای بازگشت و توجه به «جمهوریت» بیرنگشدهٔ قانون اساسی و اسباب پیدایش «تعامل» که اصلیترین هدف فراموششده در نظام و کشور گردیده است، فراهم گردد.
بیشک برای پیشگیری از این خطاها میتوانید دوربینهای مشرف بر این مزار را کنترل و عوامل خطاکار را شناسایی کنید و برای تبری سازمان متبوع خود، آنان را به مردم و مبادی ذیربط معرفی نمایید.
1 PX = 0.75 PT
12 PX = 9 PT
یک پوینت برابر یک هفتاد و دوم اینچ است اگر با توابعی مختصات Screen را بدست آوردید ( به پیکسل ) به pt تبدیل و برای تبدیل به اینچ از روش زیر استفاده کنید.
One point is equal to 1/72 of an inch
Note that all dimensions retrieved by GetSystemMetrics are in pixels.
GetSystemMetrics nIndex ' Lib "User32"
SM_CXSCREEN=0 عرض به پیکسل در 0.0104 به اینج
SM_CYSCREEN=1 ارتفاع به پیکسل در 0.0104 به اینچ
(1÷72)×0.75=0.0104166667
12px × 0.0104166667=0.125 in
0.125 in × 25.4 = 3.175 mm
0.125 in × 2.54 = 0.3175 cm
پس یک پیکسل حدودا برابر با 0.0104 اینچ و 0.264 میلیمتر است.
www.khabaronline.ir/amp/1584248/
سخنگوی شورای شهر تهران ادامه داد: ما در جمهوری اسلامی سیاست های رسمی داریم و انقلاب اسلامی سال 57، ضدیت با سلطنت 2500 ساله شاهنشاهی بود. یعنی ما غیر از پادشاهی حضرت داوود و حضرت سلیمان، هیچ پادشاهی دیگری را به رسمیت نمی شناسیم. این در حالی است که خیابان انوشیروان چند کوچه پایین تر از دفتر مقام معظم رهبری قرار دارد و وجود نام این پادشاه روی یک خیابان در آن منطقه قطعا با اصول انقلاب اسلامی تعارض دارد.
یک خاخام یهودی در اظهاراتی عجیب و ضد ایرانی گفت: برای نابودی برنامه هستهای ایران دعا کنید و نماز بخوانید!
منبع: کاوش مدیا
دوستان دستکاری بعضی از خاصیت ها در پنجره پراپرتی شیت فرم اکسس فقط در نمای دیزاین امکانپذیر است و نمی توانید مستقیم از فرم در حال نمایش آنها را تغییر دهید پس اگر دیتابیس را بصورت accde در آورید بهیچ عنوان کد vba شما کارائی نخواهد داشت از طرفی اگر به accde تبدیل نشود امکان هک کردن بسیار بالاست.
لطفا در نظر سنجی شرکت نمائید.
فرض کنید در سل خاصی مقداری را وارد می کنید و می خواهید بعد از مقدار دادن یک ردیف جدید ایجاد گردد. در کد زیر اگر insert در سلول b2 تا b20 وارد شود یک ردیف جدید ایجاد می گردد.
در کد زیر Date در ستون A درج میشود و اگر چیزی در ستون B وارد کنید از Row 2 آغاز می شود.
کد زیر : فرض شده در ستونی کد A تا فرضا D ( به تعداد دلخواه و نامرتب یا سورت نشده ) و مقدارشان هم در ستون کناری قید گردیده در ستون های دیگر قرار است کد یونیک و کنارش جمع کد یونیک ها زده شود ... ممکن است کد نیاز به دستکاری داشته باشد ولی راهکار همین است.درستون A و ردیف یک آیتم های A تا D به تعداد دلخواه و نامرتب وارد شود و کنارشان اعداد دلخواه.
Sub CountCodes()
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
Dim wbk As Workbook
Dim ws As Worksheet
Dim wsRow As Long, newRow As Long Dim Names() As String
Dim Found As Boolean
Dim Cell As Range
Set wbk = ThisWorkbook
Set ws = wbk.Worksheets(1)
ReDim Names(0 To 0) As String
newRow = 1
With ws
گرفتن آخرین ردیف در ستون A
در پائین لوپی زده شده در آرایه از پائین ترین سطح تا بالاترین ، از AutoFilter برای فیلتر کردن ستون A1 استفاده شده و یکی یکی مقادیر داخل آرایه در شرط آن قرار میگیرد
کد زیر یک Blank Line در زیر ردیفی که مقدارصفر در ستون مربوطه وارد میشود ایجاد میکند.
Sub BlankLine()
Dim Rng As Range
Dim WorkRng As Range
On Error Resume Next
xTitleId= "Relax"
Set WorkRng= Application.Selection
Set WorkRng=Application.InputBox("Range", xTitleId, WorkRng.Address, Type: = 8)
Set WorkRng= WorkRng.Columns(1)
xLastRow= WorkRng.Rows.Count
Application.ScreenUpdating = False
For xRowIndex = xLastRow To 1 Step - 1
Set Rng= WorkRng.Range("A" & xRowIndex)
If Rng.Value = "0" Then
Rng.Offset(1, 0).EntireRow.Insert Shift: = xlDown
End If
Next
Application.ScreenUpdating = True
End Sub
دوستان گل تمامی کدها از سایت ها استخراج شده جهت سهولت کاری شما عزیزان لطفا لطفا در نظر سنجی شرکت کنید
.
انتقال کرسر به رکورد بعدی
DoCmd.RunCommand acCmdRecordsGoToNext
acCmdCut
acCmdUndo
acCmdCopy
acCmdPase
acCmdZoom150
acCmdWindowHide
acCmdSelectReord ' SingleForm
acCmdSelectForm
acCmdSelectReport
کاربرد مثال زیر برای به حداکثر یا به حداقل رساندن سایز پنجره اکسس یا برگشت به وضعیت قبلی است.
Sub WinSize(strSize As String)
Select Case strSize
Case "Max"
DoCmd.RunCommand acCmdAppMaximize
Case "Min"
DoCmd.RunCommand acCmdAppMinimize
Case "Rest"
DoCmd.RunCommand acCmdAppRestore
Case Else
MsgBox strSize & " is not a valid argument"
End Select
End Sub
برای انتخاب آبجکت مورد نظر مثل فرم یا جدول و مخفی کردن آن اول از Docmd.SelectObject و تعریف آبجکت موردنظر و سپس از Docmd.RunCommand acCmdWindowHide استفاده میشود و برای نمایش آن آبجکت فقط از SelectObject استفاده می شود.
انتخاب و حذف رکورد :
Docmd.SetWarnings False
DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdDeleteRecord
Docmd.SetWarnings True
انتقال به رکورد بعدی با :
Docmd.GotoRecord
بستن تمام پنجره های باز acCmdCloseAll
بستن دیتابیسacCmdCloseDatabase
بستن فرم جاریacCmdCloseWindow
کامپکت کردن دیتابیس اما نه دیتابیس باز !!!
acCmdCompactDatabase
acCmdFind بازکردن پنجره جستجو
استفاده از متد Docmd.Restore نیز برای برگرداندن سایز پنجره Max یا Min شده به سایز قبلی است فرضا زمانیکه پنجره اکسس را Hide می کنید با تابع API و گزارشی را مینیمایز می کنید برای برگرداندن به حالت قبلی خودش که قابل مشاهده بوده این دستور را Fire کنید.
Hide Application.hWndAccessApp : showwindow
استفاده از متد hWndAccrssApp برای تعیین هندل تخصیصی توسط ویندوز به پنجره اصلی Access که برای استفاده از تابع بالا حتما برای مقدار دهی آرگومان hWnd از این متد استفاده بنمائید.
تغییرشکل Cursor زمانیکه نشانگر روی باتن نگه داشته میشود و دو مقدار دارد صفر دیفالت و یک HyperlinkHand بصورت دست نشان داده میشود.
ازتابع API هم می توان استفاده کرد در MouseMove کنترل استفاده کرد و در MouseMove دیتیل هم برابر مقدار قبلیش تعیین کرد
LoadCursor loadcursora
Screen.MousePointer هم هست می توان در MouseMove کنترل گفت اگر داخل x و y بود اعمال شود و در MouseMove دیتیل هم Reset شود.
Screen.MousePointer = 11 'HourGlass
Same as Docmd.HourGlass
Textbox.DisplayAsHyperlink نشانگر را به شکل دست نمایش میدهد.
vba/api/access.textbox.displayashyperlink
"your text <a href = """ & url & """>" & url & "</a>"
در تصویر زیر سه Toggle Button در OptionGroup با نام Frame5 قرار گرفته و ولیوی آنهای به ترتیب 0 تا 2 است با کلیک روی اولین باتن ، تمام رکوردهایی که فیلد chk آنها تیک خورده یا نخورده در سابفرم آورده میشود Forms!Form1!Frame5=0 ، کلیک روی باتن دوم رکوردهایی که فیلد chk آنها غیر صفر است در سابفرم لیست میشود و باتن آخر هم لیست رکوردهایی است که فیلد chk آنها صفر یا تیک ندارند
در تصویر زیر فرمی Simulate شده که سه کنترل CheckBox برای فیلتر کردن گرید A تا B ( فیلد Grade ) و دو کنترل CheckBox دیگر برای فیلتر کردن تیک خورده ها یا نخورده ها ( فیلد chk )، دارد چنانچه هیچکدام از ۵ چک باکس تیک نخورده باشند کل داده نمایان خواهد شد.( تعداد کل ورودی در تصویر ۹ رکورد بوده )
سمت راست تصویر چهار رکورد نمایش داده شده دقیقا تیک چک باکس گرید A و تیک چک باکس ( Unchecked مربوط به فیلد chk ) در فرم زده شده ... طبق عبارت Sql کوئری شامل رکوردهایی با گرید A که تیک Chk آنها نخورده باشد.
بین هر فیلد از عملگر منطقی AND استفاده میشود و برای لیست کردن چند آیتم خاص از یک فیلد OR کاربرد دارد.
?'A' AND FALSE=FALSE
?'A' AND TRUE=NULL
'A' OR TRUE=TRUE
'A' OR FALSE=0
'A' OR TRUE=1
FALSE OR TRUE=TRUE
TRUE OR FALSE=TRUE
TRUE AND FALSE=FALSE
FALSE AND FALSE=FALSE
FALSE OR FALSE=FALSE
NULL AND FALSE=FALSE
NULL AND TRUE=NULL
NULL AND NULL=NULL
برای ارسال داده ها به اکسل نام کوئری را در دستور DOCMD.OUTPUTTO قرار می دهید.
Method vba/api/access.docmd.outputto
در تصویر زیر ، تصویر اول تمام رکوردهای جدول t نمایش داده شده شامل ۹ رکورد ایجاد شده با INSERT INTO ، تصویر سوم که فیلد DATE دارد شامل رکوردهایی است که کوچکت مساوی یک تاریخ خاص و نیز کوچکتر مساوی عدد 105 است ، تصویر چهارم یا آخر در تصویر زیر ، از رکوردهای داخل تصویر سوم آنهایی که تیک چک فیلد CHK آنها زده شده ( یا باصطلاح غیر صفر است ) را نمایش میدهد که شامل دو رکورد است .
در لینک زیر روش بیان شده ، البته هزینه بر است (کلا در چند خط خیلی کوتاه و شامل 4 تصویر که بعد از اعمال کد SQL جدول فیلترشده) . برای ارسال داکیومنت آن درخواست دهید و بعد از واریز مبلغ ده هزار تومان به ایمیل شخصی ارسال خواهدشد.
Multi Filter Select-Query-Access-
در تصویر زیر ، رکوردهایی که نام محصول به les ختم می شود لیست شده البته در SQL بجای علامت * در اکسس از % استفاده شده.اگر در اکسس عبارت جستجو بین دو * قرار بگیرد تمام رکوردهایی که نام محصول شامل آن عبارت است را می آورد چه آخر باشد چه هر جای دیگر رشته در فیلد نام محصول.
MULTIFILTER IN ACCESS :
در تصویر زیر اینطور تصور شده که فرمی با دو چک باکس برای فیلتر کردن فیلد Available و یک کنترل تکست باکس برای فیلتر کردن محتویات فیلد GradeNo موجود است.
در تصویر در صورت تیک داشتن یا نداشتن جفت تکست باکس کل رکوردها که 11 رکورد با Insert Into ایجاد شده در سابفرم نمایش داده میشود. در صورت تیک چک باکس اول رکوردهای دارای مقدار صفر یا False فیلد Available و تیک چک باکس دوم مقادیر غیر صفر یا True لیست میشوند . البته سابفرم باید Requery شود تا نتیجه فیلترشدن را ببینید.
برای اینکه در سابفرم تمام رکوردهای False و True فیلد Available نمایش داده شود می بایست :
Available=False Or Available=True
حال اگر قرار باشد فیلد Available در کوئری بیلدر مقادیر ولیوی چک باکس ها در فرم را بگیرد میشود :( در صورتیکه جفت چک باکس ها تیک نخورده باشند = False )
Available=False Or Available=False
و در اینصورت فقط مقادیر صفر یا False ها نمایش داده میشود ولی ما می خواهیم در صورت تیک نداشتن دو چک باکس و داشتن ولیوی صفر دو مقدار False و True را مشاهده بنمائیم.پس باید یکی از طرفین مخاف False شود.
FALSE OR <>FALSE=TRUE نمایش همه
TRUE OR <>FALSE = هاTRUE نمایش
FALSE OR <>TRUE= ها FALSE نمایش
TRUE OR <>TRUE=TRUE نمایش همه
در تصویر زیر دو تکست باکس تصور شده که در صورت تایپ عدد در این دو باکس اعدادی بین این دو که در جدول باشد نمایش داده میشود ، در صورتیکه یک باکس یا هر دو خالی بود از فیلتر در می آید . البته بدین شکل که اگر باکس دوم خالی باشد همه ی رکوردها و اگر باکس اول خالی باشد رکوردها تا مقدار باکس دوم مشاهده میشود در این دو تکست باکس چک میشود که اگر PartNo در جدول نباشد ارور بدهد در رویداد LOST FOCUS می توان با DlookUp چک کرد اگر نبود پراپرتی OldValue مقدار Value تکست باکسی شود که در حال Exit از آن هستید از رویداد Exit هم میشود بهره برد.
حال در تصویر زیر تکست باکس اول در فرم Null و تکست باکس دوم 1003 است ( جدول کلا 11 رکورد دارد )
(GradeNo>='' Or True) And (GradeNo<='1003' Or False)
عبارت بالا برای زمانی نیست که در دو تکست باکس اعدادی تایپ شود که در جدول وجود ندارد یا حتی در آنها کاراکتر غیر عددی وارد شود اگر صحت موجود بودن مقادیر در جدول چک نشود این عبارت False را بر می گرداند و هیچ رکوردی نمایش داده نخواهد شد.
(GradeNo='123' Or False) AND (GradeNo='896' Or False)
False And False=False ' No Record
بررسی عبارات زیر :
(GradeNo Between '458' And '678' Or False Or False)
458 , 678 Not Exist in Above Table
FALSE AND FALSE OR FALSE OR FALSE=FALSE
پس چون نتیجه FALSE است رکوردی نمایش داده نخواهدشد.
(GradeNo Between Null And '678' Or True Or False)
678 Not Exist in Above Table
NULL AND FALSE OR TRUE OR FALSE=TRUE
پس چون نتیجه TRUE است تمام رکوردها نمایش داده خواهدشد.
(GradeNo Between Null And Null Or True Or True)
Two Boxes Are Null
NULL AND NULL OR TRUE OR TRUE=TRUE
پس چون نتیجه TRUE است تمام رکوردها نمایش داده خواهدشد.
برای اینکه مقادیر وارد شده در دو تکست باکس را صحت سنجی نکنیم و در صورت تایپ مقداری خارج از جدول می بایست یک عبارت دیگر به شرط اضافع کرد مثل
OR (TRUE AND FALSE)
که در صورت پر بودن تکست باکس ها ،دو TRUE و FALSE داخل پرانتز TRUE شوند و در نتیجه کل رکوردها نمایش داده شوند و در اینجا جستجو کننده پی خواهد برد که یکی از مقادیر تایپ شده یا هر دو در جدول وجود ندارد البته جلوگیری از تایپ عددی یا تاریخی خارج از محتویات فیلد کار خوب و استانداردی است ولی خوب کوئری نویسی آسان بنظر میرسد ولی می بینید به همین سادگی که گفته شد نیست مگر اینکه عملگرهای منطقی را کاملا فرا بگیرید.
>>>>>> nullguide-oper
اگر دو تکست باکس پر باشند ولی در جدول ناموجود می توانید عبارت بالا را اضافه کنید . ( ... BETWEEN....AND...OR...OR)
(NULL(FALSE) AND NULL(FALSE) OR TRUE OR TRUE )OR (TRUE AND TRUE)=TRUE (NULL OR TRUE=TRUE)
تکست باکس اول NULL است و تکست باکس دوم مقداری که در فیلد GRADENO وجود ندارد یا حاوی کاراکتر غیر عددیست.
(NULL(FALSE) AND FALSE OR FALSE OR TRUE) OR (TRUE AND FALSE)=TRUE
NULL AND FALSE=FALSE
FALSE OR FALSE OR TRUE=TRUE
TRUE OR (TRUE AND FALSE)=TRUE OR FALSE=TRUE
جستجو بین دو تاریخ :
دو کنترل تکست باکس به نام های TXTDATEFROM و TXTDATETO . ( سعی کنید دو تا باکس را چک کنید اگر تاریخ اولی از باکس دومی بزرگتر بود خطائی صادر کرده یا باکس را NULL در نظر بگیرد.
BETWEEN TXTDATEFROM AND TXTDATETO OR FORMS!FORM1!TXTDATEFROM IS NULL OR FORMS!FORM1!TXTDATETO IS NULL
فرضا در جدول تاریخ های 1397/01/30 و 1398/02/01 نداریم تکست باکس ها را با این دو رشته پر می کنیم بعد از خروج از تکست باکس ها پراپرتی VALUE میشود مقادیری که گفته شد.چون دو تاریخ در جدول نیست پس برای هر کدام FALSE را بر می گرداند و نتیجه آخر FALSE است و هیچ رکوردی نمایش داده نخواهد شد.
(FALSE AND FALSE OR FALSE OR FALSE) =FALSE OR FALSE=FALSE ' NO RESULT
اگر تکست باکس اول NULL باشد و تکست باکس دوم دارای رشته ای باشد که داخل جدول نباشد( =FALSE) و بالعکس تمام رکوردها لیست خواهند شد :
(NULL AND FALSE OR TRUE OR FALSE)=FALSE OR TRUE OR FALSE=TRUE 'SHOW ALL RECORDS
تصویر زیر ، خود گویای توضیحات ارائه شده بالا است . جدول شامل کلا ۱۱ رکورد است یکی از تکست باکس ها خالیست و برابر NULL و در دیگری عددی خارج از اعداد جدول ، زمان اجرای کوئری تمام ۱۱ رکورد نمایش داده شده.
دوستان فراگیر ، مطالبی که در این یادداشت ها قرار داده میشود کاملا توضیح داده شده از کپی کاری پرهیز و سعی کنید برای خواندن مطالب وقت گذاشته ، به داکیومنت آفیس که مرجع است مراجعه کنید . لطفا در نظر سنجی هم شرکت کنید ( از انتخاب منو گوشه راست بالا ). بنده برنامه نویس نیستم فقط یادداشت هایی که از سایتهای خارجی استخراج کرده را برای خودم و شما به اشتراک خواهم گذاشت انشاءا... .کلام آخر ، کد آماده به درد تازه واردها نخواهد خورد سعی کنید مطالب را از همین بلاگ یاد بگیرید.
نظرات باز است در زیر همین یادداشت هم می توانید اعلام نظر بفرمائید و نظرسنجی فراموش نشود !!!
انتقال فوکس به تب مورد نظر :
فرض کنید در پراپرتی شیت تب کنترل خاصیت Style را به None تغییر داده ( که کلا تب ها مشخص نشود ) و کامند باتنی خارج از تب کنترل ایجاد کرده اید ، زمان کلیک کردن روی باتن CmdOrder فوکس به اولین پیج کنترل TabCtl0 میرود. ( تنظیم Style تب براب عدم ظاهر شدن تب ها و ایجاد باتن بخاطر این است که چپ چین است و خاصیت راست چین نداد )
Private Sub cmdOrder_Click()Me.TabCtl0.Pages(0).SetFocusEnd Sub
Tabcontrol.Style Properties :
ظاهر شدن باتن بجای تب با تنظیم کردن خاصیت Style به یک ، البته در برگه پرارتی تب کنترل ( Property Sheet آن ) می توان خاصیت را انتخاب و تنظیم نمود احتیاجی به کد نویسی نیست
Forms("Mailing List").Controls("TabCtl1").Style = 1
در تصویر زیر :
باتن Main نامش butMain است
تب کنترل نامش tabMenu است
Style مربوط به خاصیت تب کنترل است که Property Sheet آن در نمای دیزاین قابل دسترسی است
هرکدام از تب ها نامگذاری شده و هر کدام از پیج ها PageIndex دارد . Page1 در اینجا pageMain نامگذاری شده در رویه زیر که مربوط به باتن Main در تصویر است گفته شده به تب pageMain برود (Value=0 , PageIndex=0 ) طبق شکل تب pageMain که قبلا page1 نامیده شده در تب کنترل ولیوی صفر دارد و پیج ایندکس تب هم صفر است در نتیجه به تب صفر میرود که همان ابتدا است.
Private Sub ButMain_Click()
tabMenu.Value=pageMain.PageIndex
End Sub
پراپرتی Value یک TabControl حاوی شماره ایندکسی از آبجکت Page جاری است.یک آبجکت Page برای هر Tab در TabControl وجود دارد . اولین آبجکت Page همیشه ایندکس 0 دارد و دومی 1 و ادامه دارد ( عدد صحیح و ترتیبی )
پراپرتی PageIndex بین اعداد صحیح 0 و پراپرتی Count کالکشن Pages منهای یک تنظیم میشود.این پراپرتی در هر View می تواند تنظیم شود.تغییرمقدارپراپرتی PageIndex موقعیت آبجکت Page در کالکشن یا مجموعه Pages را تغییر و باعث تغییر آشکارا و قابل دید ترتیب پیج ها روی تب کنترل می شود.( منظور زمانیکه ست کنید از یک پیج به پیج دیگری منتقل یا Move می شوید !!!)
For i=0 To Tabctl0.Pages.Count-1
Msgbox Tabctl0.Pages(i).Name & Chr(34) _
Tabctl0.Pages(i).PageIndex
Next
مثال زیر پیج با نام Notes روی تب کنترل Information در فرم Order Entry را به اولین پیج انتقال میدهد
Forms("Order Entry").Controls("Information").Pages("Notes").PageIndex = 0
CommandButton.TabIndex Property :
تعیین موقعیت کنترل در Tab Order فرم ( محل چیدمان کنترل ها ) . عدد صحیحی است بین صفر تا تعداد کل کنترل ها منهای یک ! بطور مثال اگر فرمی سه کنترل که هر کدام دارای پراپرتی TabIndex است ، باشد مقادیر معتبر برای این پراپرتی 0 1 و 2
تنظیم پراپرتی TabIndex به عدد صحیحی کمتر از صفر خطایی را تولید می کند.
اگر اعداد پراپرتی TabIndex کنترل ها ( هر کنترلی که این خاصیت را دارد ) تغییر دهید ترتیب انتقال روی آنها وقتی کلید Tab را می فشرید تغییر میکند. امتحان بنمائید!!! و در نظرات بنویسید استفاده خواهند برد.
Control.Properties Property :
شئ مجموعه پراپرتی ها مجموعه ای از تمام پراپرتی های مرتبط به یک کنترل است که میتوان به اعضاء تکی مجموعه با استفاده از ایندکس شئ یا عبارت رشته ای که نام شئ عضو است ارجاع داد.
اولین شئ عضو در مجموعه مقدار ایندکس صفر و تعداد کل آن در مجموعه مقداری است از پراپرتی Count مجموعه پراپرتی ها منهای یک.
For i=0 To Controls("Button1").Properties.Count-1
Debug.Print Controls("Button1").Properties(i).Name
Next
اگر کد بالا اشتباه بود فرم و کنترل را تنظیم کنید به متغیری و
For Each Prp In Ctl.Properties
Debug.Print Prp.Name
Next
نمایش کنترل ها در فرم :
Function ShowControls()Dim frmCust as FormSet frmCust = Forms("Customer")Dim i as IntegerFor i = 0 To frmCust.Count - 1Debug.Print frmCust(i).ControlNameNextEnd Function
البته پراپرتی Count در فرم برای شمارش فرم های باز است .
صرفا جهت مطالعه :
intForms = Forms.Count ' Number of open forms.
If intForms > 0 Then
For intI = 0 To intForms - 1
Set frm = Forms(intI)
Debug.Print frm.Name
intControls = frm.Count
If intControls > 0 Then
For intJ = 0 To intControls - 1
Debug.Print vbTab; frm(intJ).Name
Next intJ
و بقیه را خودتان حدس بزنید !!!
CurrentProject.allforms.count
تماما از سایت های خارجی استخراج و کپی شده امتحان کنید چنانچه اشتباه بود اصلاح شده در نظرات قید گردد
refer-to-tab-control-objects-in-vba
انتخاب Tab موردنظر Tabctl.Value=1
در رویداد Onchange که زمان تغییر تب پیج ها اتفاق می افتد در کد زیر کپشن فرم به کپشن پیج تغییر می یابد و با Select Case و پراپرتی Name پیج چنانچه نام داخل Case بود کاری را انجام دهد .
Private Sub tabMain_Change()
On Error GoTo ErrHandler
'get a reference to the active page
Dim pg As Page
Set pg = tabMain.Pages(tabMain.Value)
'update the form's caption
Me.Caption = "Customer Orders - " & pg.Caption
'take action for specific pages
With pg
Select Case .Name
Case "Page1"
'do stuff
Case "Page2"
'do stuff
Case "Page3"
'do stuff
Case "Page4"
'do stuff
End Select
End With
ExitHere:
On Error Resume Next
Set pg = Nothing
Exit SubErrHandler:
Debug.Print Err, Err.Description
Resume ExitHere
End Sub
The Change event occurs when the contents of a text box or the text portion of a combo box changes. It also occurs when you move from one page to another page in a tab control.
With Your_Form
If !tabControl.Pages(!tabControl.Value).Tag = "Your tag" then
'Do Something
End if
End With
The .Value
property of a TabControl returns the index (zero-based) of the current page. So, if I have a TabControl named TabCtl14
that contains two pages, FirstPage
and SecondPage
, then the code...
Private Sub TabCtl14_Click() If Me.TabCtl14.Value = 1 Then MsgBox "SecondPage was clicked." End If End Sub
...displays the MsgBox whenever I click the "SecondPage" tab in the TabControl.
قصد دارید عددی را به حروف فارسی یا انگلیسی برگردانید بنده بعنوان یک مبتدی و در این سطح به شما دوست اکسسی عزیز عرض میکنم بنده در ذهن خودم تصور کردم اول می بایست تبدیل اعداد در همان سه رقم اول یعنی یکان دهگان و صدگان را انجام دهم سپس یک تابع جداکننده اعداد سه رقم سه رقم ایجاد کنم و در نهایت در تابعی بگویم برای سه رقم اول هیچ رشته ای برای سه رقم دوم ، هزار سه رقم سوم میلیون و الی ..... در نظر بگیر که بعد از این سه رقم ها به رشته ای که میخواهید بسازید اضافه گردد. ( Public Function )
در بالا یونیک چارت وجود دارد بجای فارسی کردن پنجره Vba وچون اکسس یونیکد فارسی را ساپورت نمیکند بهتر است از یونیکد بالا در تابع Chrw برای نمایش معادل فارسی در تکست باکستون استفاده بنمائید...
در مرحله اول شما می توانید تابعی برای تبدیل حروفی اعداد بصورت ۳ تایی بسازید و از آرایه کمک بگیرید و طبق گفته بالا برای حروف از یونیکد فارسی آن استفاده کنید
S(0)=CHRW(1589)+Chrw(1601)+Chrw(1585) صفر
S(1)=Chrw(1740)+Chrw(1705) یک
.
.
.
S(10)=ده
S(20)=بیست
.
.
S(90)=نود
S(100)=یکصد
S(200)=دویست
.
.
S(900)=نهصد
در اینجا باید بین سه رقم لوپ بزنید و معادل فارسی هر عدد که در آرایه تنظیم کردید را برگرداند برای اینکار باید فرضا عدد شما 123 باشد می بایست این عدد به 100 20 و 3 تجزیه شده و این 3 عدد را در آرایه بیابد و معادلش را چاپ کند.
در تصویر بالا مشاهده می کنید که برای بدست آوردن 100، 20 و 3 از ترکیب دو تابع Left و Mid استفاده شده . از تابع Mid استفاده شد تا اعداد 1 ، 2 و 3 را جدا کند و به فرمت 000 در آورد
For i=1 To Len("123")
C=Len("123")
X=CVal(Left(Mid("123",i,1) & "000",C))
'Mid("123",i,1) :
'Mid("123",1,1)=1 & "000"=100
'Mid("123",2,1)=2 & "000"=200
'Mid("123",2,1)=3 & "000"=300
'C=3 Then Left(100,3)=100
'C=2 Then Left(200,2)=20
'C=1 Then Left(300,1)=3
Ret=Ret & IIf(Ret="","",Chrw(1608) & S(X)
C=C-1
Next
Function=Ret
فانکشن بالا ترجمه گرتون میشه که عدد سه رقمی رو تبدیل به حروفی میکنه که در آرایه ای ذخیره شده اند
حال باید تابع دیگری بنویسید که عددتون رو سه رقم سه رقم جدا بنماید.
اول دانستن کاربرد Back Slash در Vba
Dim MyValue
MyValue = 11 \ 4 ' Returns 2.
MyValue = 9 \ 3 ' Returns 3.
MyValue = 100 \ 3 ' Returns 33.
تصویر زیر هم در نظر داشته باشید
با تابع String می توانید کاراکتر مورد نظرتون را به تعداد مورد نیاز چاپ کنید فرضا در تصویر بالا 8 بار کاراکتر صفر تکرارشده و با تابع فرمت گفته شده عدد دو در شکل و غالب صفرها نمایش داده شود ساده ترین راه اینه که اول مشخص کنید عددتون چند قسمت میشود فرضا عدد 1234 ... طولش 4 است
4\3=1
4 Mod 3<>0 Then 1+1=2
n=2
پس 1234 شامل دو پارت میشود ( n ) یکی 1 و دیگری 234
بین یک تا عدد n لوپ زده شود For i=1 To n و قبل از آن با دو تابع تصویر بالا رشته "001234" حاصل می شود یعنی جای عدد 8 باید 2×3 قرار داده شود وبجای "2" رشته عددی "1234"، سپس با تابع Mid می توانید سه رقم سه رقم جدا کنید
چون n برابر 2 است پس دوبار حلقه تکرار می شود
آرگومان اول Mid همان نقطه شروع(Start) و بعدی طول (Length) است در لوپ اول از اولین کاراکتر شروع میکند و رشته ای با طول 3 را برمی گرداند در لوپ دوم یعنی n=2 نقطه شروع باید بشود 4 بخاطر همین از Start=Start+3 استفاده شده و طول ثابت است چون در هر لوپ رشته ای با طول ۳ مد نظر ما است اساتید بزرگ .
Start=1
For i=1 To n
K=Mid("001234",C,3)
'Mid("001234",1,3)=001
'Mid("001234",4,3)=234
Ret=Ret & IIf(Ret="","",",") & k
Start=Start+3
Next
Function=Ret
فرض کنید عدد 234 دارید
3\3=1 AND 3 MOD 3=0 Then n=1
Mid("234",1,3)
عدد 23
2\3=0 AND 2 MOD 3<>0 Then n=0+1
Mid("023",1,3)
عدد 12345678 :
8\3=2 And 8 Mod 3<>0 Then n=2+1=3
Mid("012345678",1,3)=012
Mid("012345678",4,3)=345
Mid("012345678",7,3)=678
برای عدد 12345678 بالا با فرمت "012345678" و n=3 توسط تابع Mid و تکرار لوپ به تعداد n سه عدد جداگانه بدست آوردیم. کلیات این تابع میشود جدا کردن ارقام بصورت ۳ تایی و در نهایت در تابع اصلی استفاده میشود.
مرحله آخر تابع اصلی است که عدد از کاربر گرفته می شود فرضا تابع (GetValue(n As Long و عدد را داخل تابع جداکننده می گذارد و جواب آن که بصورت "012,345,678" است را با تابع Split جدا کرده و می گوئیم که یکی یکی در تابع ترجمه گر قرار دهد و به حروف برگرداند حال در اینجا چیزی که مورد نیاز است حروف هزار ، میلیون ، میلیارد و ....
درمثال بالا می توانید در همان تابع آرایه ای بسازید و حروف هزار ، میلیون ، میلیارد ، تریلیون و تریلیارد را ذخیره کنید و چون i در عملیات تابع Mid نقشی ندارد می توانید بنویسید FOR i=n To 1 ، در نتیجه اگر فرض کنیم تابع دیگری نسازیم می توانیم در تابع دوم بگوئیم
Dim A(1 To 5 ) As String
A(1)=""
A(2)="هزار" USE CHRW !!!
A(3)="میلیون" USE CHRW
A(4)="میلیارد"
و اگر نام تابعی که سه رقم اعداد را به حروف بر می گردانیم (T(num باشد در تابع Mid باید گفت
Ret=Ret & IIf(Ret="",""," " & Chrw(1608)
T(k) & A(n)
در شروع لوپ Ret جوابی ندارد توسط تابع IIF چک شده اگر جواب داشت از حرف "و" استفاده شود چک میکنیم
String : 12345678
8\3=2 AND 8 Mod 3 <>0 Then n=(8\3)+1=3
n=3
Ret=""
A(3)="یک میلیون"
Ret="یک میلیون "
n=2
Ret="یک میلیون" ' ( Ret <>"" ) Use "و"
A(2)="هزار"
Ret="یک میلیون ( و ) سیصد و چهل و پنج هزار "
n=1
Ret="یک میلیون و سیصد و چهل و پنج هزار " ' ( Ret<>"" ) "و"
A(1)=""
Ret=یک میلیون و سیصد و چهل و پنج هزار( و ) ششصد و هفتاد و هشت
End Loop!!!
بسیار ساده به ساخت توابعی برای تبدیل عدد به حروف فارسی پرداخته شد در صورت وجود مورد یا اشتباه لطفا در نظرات تصحیح شده درج گردد
تصویر بالا هم احتیاجی به ذخیره حروف فارسی در آرایه نداره و کلا اعداد ۳ رقم ۳ رقم جدا شده و فقط بین آنها از عبارت هزار استفاده شده و جای کمتری هم گرفته.
مایکروسافت اکسس فرم ها را به داده متصل می کند و بصورت خودکار آن داده ها ذخیره خواهند شد چه شما بین رکوردها جابجا شوید یا فرمی که در آن کار می کنید را ببندید.این عمل که بصورت خودکار انجام میگیرد خوب است بخاطر اینکه شما داده ای را از دست نخواهید داد حتی اگر بطور اتفاقی بعد از ویرایش ببندید.
اگر این عمل چیزی نیست که شما دنبالش هستید.پیشنهاد میکنم از حالت اتصال به فرم خارج کنید و خاصیت رکورد سورس را Blank بگذارید ( اگر در رکورد سورس چیزی هست پاک کنید ) سپس از کنترل هایی که با Tools می سازید استفاده کنید ( منظور از فیلدهای جدول یا منبع فرم استفاده نکنید ) و بالطبع باید برنامه نویسی برای اضافه کردن به جدول یا ویرایش یا حتی حذف آنها بکار ببرید.
انتخاب دیگر که تمایل به انجامش را داشته باشید این است که از رویداد BeforeUpdate فرم برای اینکه از کاربران بپرسند آیا میخواهند تغییرات ذخیره شود استفاده کنید
اگر نگرانی اصلی شما اضافه شدن بطور ناگهانی رکوردهای جدید است خاصیت Allow Addition را به false تنظیم کنید و رکورد جدید را بصورت برنامه نویسی شده ایجاد نمائید.
در زیر کدی نوشته شده که در سینگل فرم از کاربر می پرسد که میخواهد رکورد حاضر را ذخیره کند یا خیر اگر خیر باشد پارامتر کنسل True می شود و در نتیجه تا زمانیکه Escape را نزنید از رکورد خارج نمیشود امتحان بنمائید !
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim intAns As Integer
intAns = MsgBox("Are you sure you want to save this record?", vbQuestion + vbYesNo, "Save Record") If intAns = vbNo Then Cancel = 1
End Sub
فراگیران عزیز سوالات در زمینه اکسس را در نظرات همین یادداشت بنویسید تا سایر دوستان نیز در جوابگویی کمک کنند و خواهشا در نظر سنجی نیز شرکت بفرمائید.
دوستان اکسسی یک کوئری ( یا پرس و جو از جدولی ) را طبق درخواست ( در ادامه ) بنویسید و در نظرات این یادداشت قید کنید که جمع گروه خاصی رو پشت سرهم نمایش بدهد ، فرضا در جدول سه رکورد A می سازید با قیمت های ۱۲۰۰۰ ۱۸۰۰۰ ۲۳۰۰۰ و چهار رکورد B با قیمت های ۸۰۰۰ ۴۵۰۰ ۱۴۳۰۰ ۸۷۰۰ ... کوئری باید طوری نوشته شود که جمع فعلی را با قبلی زده و مانند ذیل بشود.
A 12000
A 12000+18000
A 12000+18000+23000
B 8000
B 8000+4500
B 8000+4500+14300
B 8000+4500+14300+8700
از ساب کوئری استفاده کنید وکد را در نظرات بنویسید تا دیگران هم طریقه استفاده از SubQuery را فرابگیرند ... اجرکم عندا...
تاریخ اعمال ۶اسفند ۹۹ و تاریخ اعتبار قیمت ۳ ماه
خصوصی ساعتی 250
گروهی ساعتی 200
درصورت درخواست در نظرات قید گردد
اعتبار به پایان رسید لطفا از طریق کتاب های آموزشی اقدام نمائید و سعی کنید به VB6 یا VB.NET شیفت کنید ACCESS قابل اطمینان نیست.
کیفیت آموزشی و استخدامی مدرن جمهوری اسلامی و حقوق های مناسب امروزی
لطفا درخواست پروژه های ( فقط اکسس ) خود را به جی میل accessvbablogsky@gmail.com ارسال کرده تا بررسی و قیمت ارائه گردد