Write below logic in user exit USEREXIT_SAVE_DOCUMENT_PREPARE under program MV45AFZZ, useful while writing validations for both points.
DATA: V_DATUM TYPE SYDATUM,
V_FLAG TYPE FLAG.
DATA: IT_VBAK TYPE TABLE OF VBAK,
IT_VBAP TYPE TABLE OF VBAP,
IT_VBPA TYPE TABLE OF VBPA.
DATA: WA_VBAK TYPE VBAK,
WA_VBAP TYPE VBAP,
WA_VBPA TYPE VBPA.
IF SY-TCODE = 'VA01'
OR SY-TCODE = 'VA02'.
IF VBAK-VKORG = '0020'
AND VBAK-SPART = '0030'.
*Get all the sales orders created in last two days
V_DATUM = SY-DATUM - 2.
REFRESH IT_VBAK.
SELECT * FROM VBAK "select only required fields
INTO TABLE IT_VBAK
WHERE ERDAT GE V_DATUM.
IF SY-SUBRC EQ 0.
SORT IT_VBAK BY VBELN KUNNR.
*Get all sales orders' items created in last 2 days
REFRESH IT_VBAP.
SELECT * FROM VBAP "select only required fields
INTO TABLE IT_VBAP
FOR ALL ENTRIES IN IT_VBAK
WHERE VBELN = IT_VBAK-VBELN.
IF SY-SUBRC EQ 0.
*Get ship to party customers for all orders created in last 2 days
REFRESH IT_VBPA.
SELECT * FROM VBPA "select only required fields
INTO TABLE IT_VBPA
FOR ALL ENTRIES IN IT_VBAK
WHERE VBELN = IT_VBAP-VBELN
AND POSNR = IT_VBAP-POSNR
AND PARVW = 'SH'. "Ship to party
IF SY-SUBRC EQ 0.
SORT IT_VBPA BY VBELN POSNR KUNNR.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
After the above code execution, you will have all sales orders' data for last 2 days.
Now, do the checking against XVBAP, VBAK and XVBPA.
*First run validation as per point 1
LOOP AT XVBAP.
CLEAR XVBPA.
READ TABLE XVBPA INDEX 1.
IF SY-SUBRC EQ 0.
ENDIF.
LOOP AT IT_VBAP INTO WA_VBAP WHERE MATNR = XVBAP-MATNR
AND ZMENG = XVBAP-ZMENG.
CLEAR WA_VBAK.
READ TABLE IT_VBAK INTO WA_VBAK WITH KEY VBELN = WA_VBAP-VBELN
KUNNR = VBAK-KUNNR
BINARY SEARCH.
IF SY-SUBRC EQ 0.
CLEAR WA_VBPA.
READ TABLE IT_VBPA INTO WA_VBPA WITH KEY VBELN = WA_VBAP-VBELN
POSNR = WA_VBAP-POSNR
KUNNR = XVBPA-KUNNR
BINARY SEARCH.
IF SY-SUBRC EQ 0.
MESSAGE 'you are about to create a duplicate sales order' TYPE 'E'.
ENDIF.
ENDIF.
CLEAR WA_VBAP.
ENDLOOP.
CLEAR XVBAP.
ENDLOOP.
*Now run validation as per point 2
CLEAR V_FLAG.
LOOP AT XVBAP.
CLEAR XVBPA.
READ TABLE XVBPA INDEX 1.
IF SY-SUBRC EQ 0.
ENDIF.
LOOP AT IT_VBAP INTO WA_VBAP WHERE NETWR = XVBAP-NETWR.
CLEAR WA_VBAK.
READ TABLE IT_VBAK INTO WA_VBAK WITH KEY VBELN = WA_VBAP-VBELN
KUNNR = VBAK-KUNNR
BINARY SEARCH.
IF SY-SUBRC EQ 0.
CLEAR WA_VBPA.
READ TABLE IT_VBPA INTO WA_VBPA WITH KEY VBELN = WA_VBAP-VBELN
POSNR = WA_VBAP-POSNR
KUNNR = XVBPA-KUNNR
BINARY SEARCH.
IF SY-SUBRC EQ 0.
MESSAGE 'you are about to create a duplicate sales order' TYPE 'W'.
V_FLAG = 'X'.
EXIT.
ENDIF.
ENDIF.
CLEAR WA_VBAP.
ENDLOOP.
CLEAR XVBAP.
IF NOT V_FLAG IS INITIAL.
EXIT.
ENDIF.
ENDLOOP.
Hope it helps!