کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی
کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی

برقراری تماس از طریق مودم GSM با دستورات AT COMMAND یا فایل HYPER TERMINAL و حتی ارسال پیام ( به فرمت PDU )

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

دستورات AT در ارسال پیام به دستگاه




مجموعه ای ارزنده از دستورات ارتباطی گرد آوری شده از سایت ها



Communications





A tool to provide a visual means to send and receive data through serial ports


terminal_online_installer.exe

serial-port-terminal1.software


hyperterminal.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 نامیده می شوند.


sms/atCommandsIntro


Cell Phone Book Find : 

AT+CPBF command is used to find the entries of the phone book

Cell Phone Book Read :
AT+CPBR command is used to read entries of the phone book
Cell Phone Book Storage :
AT+CPBS command is used to choose the storage of phone book memory
Cell Phone Book Write :
AT+CPBW command is used to write phone book entry




The commands used for SMS text mode mainly include the following.

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

AT+CSMS command is used to select message service

برای انتخاب سرویس پیام 

AT+CMGF command is used to format message

برای فرمت پیام 

AT+CMGR command is used to read the message

برای خواندن پیام

AT+CMGD command is used to delete the message

برای حذف پیام

AT+CMGS command is used to send message
برای ارسال پیام

AT+CMGW command is used to write a message to memory

برای نوشتن پیام به حافظه




howToSendSMSFromPC


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



HyperTerminal



Contact Phone Book Read
AT+CPBR=1


</a>”>AT+CPBR=?
+CPBR: (1-100),40,25
OK


 کتابچه تلفن تا 100 ورودی را پشتیبانی می کند ، حداکثر طول ورودی متن 40 و حداکثر طول شماره تلفن 25 است


جستجو کردن برای ورودی دفترچه تلفن : 

AT+CPBF="Ali"


smspdu

sms-at-commands



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


Do While True
Input #1,strInput
Debug.print Left(strInput,256)
Loop

Close #1


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

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



بین هر دستور 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+CPOWD=
n -> 0 Power off urgently
1 Normal poweroff


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

PurgeComm empties the buffer without transmission or reception (its a delete basically)

پس ما داده را می بایست به بافری ( بافر حافظه ای در Ram  برای ذخیره اطلاعات : موقت  ) انتقال بدهیم ، این تابع Api بافر را بدون انتقال یا پذیرشی خالی می کند


flushfilebuffers

بافرهای یک فایل مشخص را Flush می کند و باعث می شود تمام داده های بافر در یک فایل نوشته شوند.

A buffer flush is the transfer of computer data from a temporary storage area to the computer's permanent memory



Lib "Kernel32"


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


Set rng=Selection
Open myFile For Output As #1
For i = 1 To rng.Rows.Count
    For j = 1 To rng.Columns.Count
cellValue = rng.Cells(i, j).Value
If j = rng.Columns.Count Then
    Write #1, cellValue
Else
    Write #1, cellValue,
End If
Next
Next
Close #1




VISCAcommands


"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=مانده 

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&" بگذارید و ......


online-sms-pdu-decoder

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

rednaxela

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 )


0691891901500024
0B91893900000071
0008122192115030110406450646


Receipt requested
SMSC#+9891100500
Sender:+989300000017
TimeStamp:29/12/21 11:05:03 GMT ?
TP_PID:00
TP_DCS:08
TP_DCS-popis:Uncompressed Text
No class
Alphabet:UCS2(16)bit

من
Length:2





فرمت 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


در لینک زیر کاملا توضیح داده شده : 

Concatenated_SMS


06918919015000

240B819003000010F7

0008122192515151000406450646



To: 380933522620
Message: Hello! Test SMS in GSM-7

Encoded PDU string:
0001000C81839033256202000018C8329B FD0E81A8E5391D346D4E416937E8386DB6 6E1A

Details about PDU string:
1. 00 - skipped SMSC
2. 01 - PDU-Type
3. 00 - TP-MR
4. 0C - length of To number.
5. 81 - type of number (unknown, also tried 0x91 which is international)
6. 83 90 33 25 62 02 - To number
7. 00 - TP-PID
8. 00 - TP-DCS (GSM 7bit, default SMS class)
9. 18 - TP-UD (24 letters)
10. C8 32 ... B6 6E - packed message
11. 1A - ctrl+z





برای ارسال پیام به صورت دوپارتی : 


"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 نویسی ، پروژه پذیرفته نمی شود و فقط در حد رفع مشکل. لطفا زیر همین پست  مشکل در کد نویسی جهت رفع قرار داده شود شاید سایر دوستان نیز در رفع آن کمک بنمایند.




لطفا نظرسنجی فراموش نشود.






متن آهنگ قهرمان




There's a hero
If you look inside your heart
You don't have to be afraid
Of what you are
There's an answer
If you reach into your soul
And the sorrow that you know
Will melt away
And then a hero comes along
With the strength to carry on
And you cast your fears aside
And you know you can survive
So when you feel like hope is gone
Look inside you and be strong
And you'll finally see the truth
That a hero lies in you
It's a long road
When you face the world alone
No one reaches out a hand
For you to hold
You can find love
If you search within yourself
And that emptiness you felt
Will disappear
And then a hero comes along
With the strength to carry on
And you cast your fears aside
And you know you can survive
So when you feel like hope is gone
Look inside you and be strong
And you'll finally see the truth
That a hero lies in you, oh, oh
Lord knows
Dreams are hard to follow
But don't let anyone
Tear them away, hey yeah
Hold on
There will be tomorrow
In time you'll find the way
And then a hero comes along
With the strength to carry on
And you cast your fears aside
And you know you can survive
So when you feel like hope is gone
Look inside you and be strong
And you'll finally see the truth
That a hero lies in you
That a hero lies in you
Mmm, that a hero lies in you






قیرپاشی مزار روح الله زم








یا بسیجی ها بودند یا عناصر خودفروخته جهت تفرقه افکنی



ریاست محترم سازمان بهشت زهرا (ع)
جناب آقای غضنفری
با سلام

احتراماً از اقدامِ به‌جا و دستور خردمندانه جنابعالی در پاک‌سازی آلودگی‌های ناشی از قیرپاشیِ عوامل ناشناخته! بر سنگ مزار زنده‌یاد روح‌الله زم سپاسگزاری می‌گردد.

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

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


کار ناپسندیده ای است و متاسفانه دله دزدی و اهانت به مزار متوفی در بهشت زهرا داره مرسوم میشه و با اینهمه پولی که از مردم می گیرن ( قبرهای سه طبقه با مبلغ ۸۰ میلیون تومان ) و شهرداری ،  هنوز هم این قبیل خلاف ها انجام میشه . حتی دستگاه قضا هم ورود نکرده ، اینهمه سرباز گمنام در ایران وجود داره که می تونن روح الله زم رو دستگیر کنن  با تور اطلاعاتی ولی از پس یه مشت یاغی و معتاد بر نمیان البته گرانی و قیمت سنگ ها هم وسوسه کنندست!!!






تبدیل پیکسل به پونیت و پوینت به اینج




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 ساله شاهنشاهی بود. یعنی ما غیر از پادشاهی حضرت داوود و حضرت سلیمان، هیچ پادشاهی دیگری را به رسمیت نمی شناسیم. این در حالی است که خیابان انوشیروان چند کوچه پایین تر از دفتر مقام معظم رهبری قرار دارد و وجود نام این پادشاه روی یک خیابان در آن منطقه قطعا با اصول انقلاب اسلامی تعارض دارد.


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



khabaronline


یک خاخام یهودی در اظهاراتی عجیب و ضد ایرانی گفت: برای نابودی برنامه هسته‌ای ایران دعا کنید و نماز بخوانید!

 منبع: کاوش مدیا







مطلبی در مورد تنظیم بعضی خواص در فرم




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


لطفا در نظر سنجی شرکت نمائید.




ایجادردیف در اکسل با مقدار "insert "در سلول در رنج تعیین شده



فرض کنید در سل خاصی مقداری را وارد می کنید و می خواهید بعد از مقدار دادن یک ردیف جدید ایجاد گردد. در کد زیر اگر insert در سلول b2 تا b20 وارد شود یک ردیف جدید ایجاد می گردد.


Sub InsertRowswithSpecificValue()
Dim cell As Range
For Each cell In Range("b2:b20")
    If cell.Value = "insert" Then
        cell.EntireRow.Insert
    End If
Next cell
End Sub



در کد زیر Date در ستون A درج میشود و اگر چیزی در ستون B وارد کنید از Row 2 آغاز می شود.



Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Long
On Error GoTo SkipError 
If Target.Column = 2 And Target.Row > 1 Then 
Application.EnableEvents = False
r = Target.Row
If Target <> "" Then
If Cells(r, "A") = "" Then
Cells(r, "A") = Date
End If
Else
Cells(r, "A") = ""
End If
End If
SkipError:
Application.EnableEvents = True
End Sub


کد زیر : فرض شده در ستونی کد 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

wsRow =.Range("A" & .Rows.Count).End(xlUp).Row

 ستون A که شامل آیتم های A تا D است را درون آرایه قرار می دهد. لوپی میزند از سلول ردیف ۲ و ستون یک یعنی کالمن A تا سلول آخرین ردیف از ستون یک تابعی نوشته شده که اگر Found برابر False یا صفر شد آرایه مقدار را در خودش بگیرد بخاطر همین از Preverse استفاده شده که آرایه پویا باشد وگرنه اگر استانیک باشد اگر تعداد به آرایه اضافه شود ارور ایندکس میدهد می توانید امتحان بنمائید. البته از Pivot Table هم میشود بهره برد ولی برای زمانیست که می خواهید کلاس بگذارید و آیتم ها همراه با جمع یا شمارش را برای گزارش گیری در شیت یا ناحیه کاری دیگری قرار دهید ... در هر صورت موفق باشید اگر گزینه های دیگری هم داشتید می توانید در لوپ فیلتر کردن با ز هم از For....Each درون همان For....Each استفاده کنید.

For Each Cell In .Range(.Cells(2, 1), .Cells(wsRow, 1))
Found = (IsInArray(Cell.Value2, Names) > -1)
If Found = False Then
Names(UBound(Names)) = Cell.Value2
If Cell.Row <> wsRow Then
ReDim Preserve Names(0 To UBound(Names) + 1) As String
End If
End If


در پائین لوپی زده شده در آرایه از پائین ترین سطح تا بالاترین ،  از AutoFilter برای فیلتر کردن ستون A1 استفاده شده و یکی یکی مقادیر داخل آرایه در شرط آن قرار میگیرد


For x = LBound(Names) To UBound(Names) 
Range("A1").AutoFilter Field:=1, Criteria1:=Names(x)

For Each Cell In .Range("A1:A" & wsRow).SpecialCells(xlCellTypeVisible)
myCount = myCount + 1
Next

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

If myCount > 1 Then
For Each Cell In .Range("B2:B" & wsRow).SpecialCells(xlCellTypeVisible)
mySum = mySum + Cell.Value2
Next

مقادیر داخل تابع Names که آیتم های A تا D را در خود دارد در سلولی که در ستون 6 است درج می گردد و همینطور جمع اعدادشان در ستون 9 و ردیف هم که از یک شروع می شود

newRow = newRow + 1
.Cells(newRow, 6) =Names(x) 
.Cells(newRow, 9) = mySum

End If 
myCount = 0
mySum = 0

Next
'Remove Filter
.ShowAllData

End With 

With Application .ScreenUpdating = True
.Calculation = xlCalculationAutomatic
End With
End Sub


Function IsInArray(stringToBeFound As String, arr As Variant) As Long

Dim i As Long
IsInArray = -1
For i = LBound(arr) To UBound(arr)
If StrComp(stringToBeFound, arr(i),vbTextCompare) = 0 Then
IsInArray = i
Exit For
End If
Next i
End Function


کد زیر یک 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



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

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 در کنترل




CommandButton.CursorOnHover property


تغییرشکل 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 آنها صفر یا تیک ندارند 




Select-Query-Access-


filename=trysql_create_table









در تصویر زیر فرمی 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 و در دیگری عددی خارج از اعداد جدول ، زمان اجرای کوئری تمام ۱۱ رکورد نمایش داده شده.



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



نظرات باز است در زیر همین یادداشت هم می توانید اعلام نظر بفرمائید و نظرسنجی فراموش نشود !!!








رفتن به Tab مورد نظر با استفاده از باتن



انتقال فوکس به تب مورد نظر : 



فرض کنید در پراپرتی شیت تب کنترل خاصیت Style را به None تغییر داده (  که کلا تب ها مشخص نشود ) و کامند باتنی خارج از تب کنترل ایجاد کرده اید ، زمان کلیک کردن روی باتن CmdOrder فوکس به اولین پیج کنترل TabCtl0 میرود. ( تنظیم Style تب براب عدم ظاهر شدن تب ها و ایجاد باتن بخاطر این است که چپ چین است و خاصیت راست چین نداد )


Private Sub cmdOrder_Click()
Me.TabCtl0.Pages(0).SetFocus
End Sub


Me.tabMyTabControl.Pages(0).Visible = False
پنهان کردن اولین تب پیج  
hides the first tab page.


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 Form
Set frmCust = Forms("Customer")
Dim i as Integer
For i = 0 To frmCust.Count - 1
Debug.Print frmCust(i).ControlName
Next
End 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 را فرابگیرند ... اجرکم عندا...



آموزش VBA در اکسس



تاریخ اعمال ۶اسفند ۹۹ و تاریخ اعتبار قیمت ۳ ماه 



خصوصی ساعتی 250

گروهی ساعتی 200


درصورت درخواست  در نظرات قید گردد


اعتبار به پایان رسید لطفا از طریق کتاب های آموزشی اقدام نمائید و سعی کنید به VB6 یا VB.NET شیفت کنید ACCESS قابل اطمینان نیست.





مدیر و اولیاء بودن یا نبودن را تعیین می کنند



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


انجام پروژه های کوچک



لطفا درخواست پروژه های ( فقط اکسس )  خود را به جی میل accessvbablogsky@gmail.com ارسال کرده تا بررسی و قیمت ارائه گردد