Код: Выделить всё// CheckEmptyUsersFields service script
//------------------------------------------------------------------------------------
// If you have users with empty fields, you can export full list of them to a CSV file
// and analyze it in Excel.
// -----------------------------------------------------------------------------------
// ver 1.1 / May 12, 2012, (c) Alexey Pikurov, [email protected]
// ver 1.2 / Jun 18, 2021, (c) Alexey Pikurov, [email protected]
// help (russian) - https://www.nsoft-s.com/forum/viewtopic.php?f=1&t=4129
//------------------------------------------------------------------------------------
const
  EXPORT_FILE_NAME      = 'c:\temp\users_report.csv';
  
  CHECK_WHAT            = '<COMMON>,<WORK>,<HOME>';
  
  COMMON_FIELDS_MIN_SET = 'FirstName;MiddleName;LastName;Birthday;Sex;Avatar;';
  WORK_FIELDS_SET       = 'Email;WorkPosition;WorkCompanyName;WorkOffice;WorkPhone;WorkFax;' +
                          'WorkPager;WorkStreetAddress;WorkCity;WorkState;WorkZIP;WorkCountry;WorkWWW;';
  HOME_FIELDS_SET       = 'MaritalStatus;HomePhone;HomeFax;HomeCellular;HomeStreetAddress;HomeCity;HomeState;HomeZIP;HomeCountry;HomeWWW;';
 
function CheckDate(dt: double): boolean;
var
  iYears: integer;
begin
  iYears := YearsBetween(Now, dt);
  
    if (iYears > 100) or (iYears < 16) then result := false
      else result := true;
end;
var
  sUsersList, sJSON, sOut, sUserData, sTitle,
  sNick, sFirstName, sMiddleName, sLastName, sBirthday, sSex, sPhoto,
  sEmail, sWorkPosition, sWorkCompanyName, sWorkOffice, sWorkPhone, sWorkFax,
  sWorkPager, sWorkStreetAddress, sWorkCity, sWorkState, sWorkZIP, sWorkWWW,
  sWorkCountry, sMaritalStatus, sHomePhone, sHomeFax, sHomeCellular, 
  sHomeStreetAddress, sHomeCity, sHomeState, sHomeZIP, sHomeCountry, sHomeWWW: string;
  
  iMaritalStatus, iHomeCountry, iUIN, iSex, iWorkCountry, iAvatar: integer;
  
  dtBirthday: double;
  bFlag: boolean;
begin
  SetScriptTimeOut(20000);
  sUsersList := mGetUINSListByRole(-1);
  DeleteFile(EXPORT_FILE_NAME);
  
  sOut   := '';
  sTitle := 'UIN;Nick;';
  
    if pos('<COMMON>', CHECK_WHAT) <> 0 then sTitle := sTitle + COMMON_FIELDS_MIN_SET;
    if pos('<WORK>', CHECK_WHAT) <> 0 then sTitle := sTitle + WORK_FIELDS_SET;
    if pos('<HOME>', CHECK_WHAT) <> 0 then sTitle := sTitle + HOME_FIELDS_SET;
  
  AddLineToFile(sTitle, EXPORT_FILE_NAME, 0);      
  
    while length(sUsersList) > 0 do begin
      bFlag := false;
      
      iUIN := StrToInt(GetNextSt(sUsersList, ','));
      sJSON := mGetUserDataAsJSON(iUIN, 'Nick;' + COMMON_FIELDS_MIN_SET + WORK_FIELDS_SET + HOME_FIELDS_SET);
      
      JSONGetString(sJSON, 'Nick', sNick); 
      
      sUserData := inttostr(iUIN) + ';' +
                   DecorateStForCSV(sNick) + ';';
// COMMON -----------------------------------------------------------------------------------------      
        if pos('<COMMON>', CHECK_WHAT) <> 0 then begin
          JSONGetString(sJSON, 'FirstName', sFirstName);
          JSONGetString(sJSON, 'MiddleName', sMiddleName);
          JSONGetString(sJSON, 'LastName', sLastName);
          JSONGetDateTime(sJSON, 'Birthday', dtBirthday);
      
            if CheckDate(dtBirthday) then sBirthday := FormatDateTime('dd.mm.yyyy', dtBirthday)
              else sBirthday := '';
          JSONGetInteger(sJSON, 'Sex', iSex);
      
            case iSex of
              0: sSex := '';
              1: sSex := 'male';
              2: sSex := 'female';
            end;
        
          JSONGetInteger(sJSON, 'Avatar', iAvatar);
      
      if iAvatar = 0 then sPhoto := '' else sPhoto := 'yes';
      
            if (length(sFirstName) = 0) or (length(sMiddleName) = 0) or (length(sLastName) = 0) or 
               (length(sBirthday) = 0) or (length(sSex) = 0) or (length(sPhoto) = 0) then bFlag := true;
          
          sUserData := sUserData +
                       DecorateStForCSV(sFirstName) + ';' +
                       DecorateStForCSV(sMiddleName) + ';' +
                       DecorateStForCSV(sLastName) + ';' +
                       DecorateStForCSV(sBirthday) + ';' +
                       sSex + ';' +
                       sPhoto + ';';
        end;                    
// WORK --------------------------------------------------------------------------------------------                  
        if pos('<WORK>', CHECK_WHAT) <> 0 then begin
          JSONGetString(sJSON, 'Email', sEmail);
          JSONGetString(sJSON, 'WorkPosition', sWorkPosition);
          JSONGetString(sJSON, 'WorkCompanyName', sWorkCompanyName);
          JSONGetString(sJSON, 'WorkOffice', sWorkOffice);
          JSONGetString(sJSON, 'WorkPhone', sWorkPhone);
          JSONGetString(sJSON, 'WorkFax', sWorkFax);
          JSONGetString(sJSON, 'WorkPager', sWorkPager);
          JSONGetString(sJSON, 'WorkStreetAddress', sWorkStreetAddress);
          JSONGetString(sJSON, 'WorkCity', sWorkCity);
          JSONGetString(sJSON, 'WorkState', sWorkState);
          JSONGetString(sJSON, 'WorkZIP', sWorkZIP);
          JSONGetInteger(sJSON, 'WorkCountry', iWorkCountry);
      
            if iWorkCountry = 0 then sWorkCountry := ''
              else sWorkCountry := 'yes';
                    
          JSONGetString(sJSON, 'WorkWWW', sWorkWWW);
      
            if (length(sEmail) = 0) or (length(sWorkPosition) = 0) or (length(sWorkCompanyName) = 0) or 
               (length(sWorkOffice) = 0) or (length(sWorkPhone) = 0) or (length(sWorkFax) = 0) or
               (length(sWorkPager) = 0) or (length(sWorkStreetAddress) = 0) or (length(sWorkCity) = 0) or
               (length(sWorkState) = 0) or (length(sWorkZIP) = 0) or (length(sWorkCountry) = 0) then bFlag := true;
          
          sUserData := sUserData +
                       DecorateStForCSV(sEmail) + ';' +
                       DecorateStForCSV(sWorkPosition) + ';' +
                       DecorateStForCSV(sWorkCompanyName) + ';' +
                       DecorateStForCSV(sWorkOffice) + ';' +
                       DecorateStForCSV(sWorkPhone) + ';' +
                       DecorateStForCSV(sWorkFax) + ';' +
                       DecorateStForCSV(sWorkPager) + ';' +
                       DecorateStForCSV(sWorkStreetAddress) + ';' +
                       DecorateStForCSV(sWorkCity) + ';' +
                       DecorateStForCSV(sWorkState) + ';' +
                       DecorateStForCSV(sWorkZIP) + ';' +
                       DecorateStForCSV(sWorkCountry) + ';' +
                       DecorateStForCSV(sWorkWWW) + ';';
        end;                    
// HOME -------------------------------------------------------------------------------------------      
        if pos('<HOME>', CHECK_WHAT) <> 0 then begin
          JSONGetInteger(sJSON, 'MaritalStatus', iMaritalStatus);
          
            if iMaritalStatus = -1 then sMaritalStatus := '' else sMaritalStatus := 'yes';
            
          JSONGetString(sJSON, 'HomePhone', sHomePhone);
          JSONGetString(sJSON, 'HomeFax', sHomeFax);
          JSONGetString(sJSON, 'HomeCellular', sHomeCellular);
          JSONGetString(sJSON, 'HomeStreetAddress', sHomeStreetAddress);
          JSONGetString(sJSON, 'HomeCity', sHomeCity);
          JSONGetString(sJSON, 'HomeState', sHomeState);          
          JSONGetString(sJSON, 'HomeZIP', sHomeZIP);
          JSONGetInteger(sJSON, 'HomeCountry', iHomeCountry);
          
            if iHomeCountry = -1 then sHomeCountry := '' else sHomeCountry := 'yes';          
            
          JSONGetString(sJSON, 'HomeWWW', sHomeWWW);
      
            if (length(sMaritalStatus) = 0) or (length(sHomePhone) = 0) or (length(sHomeFax) = 0) or 
               (length(sHomeCellular) = 0) or (length(sHomeStreetAddress) = 0) or (length(sHomeCity) = 0) or
               (length(sHomeState) = 0) or (length(sHomeZIP) = 0) or (length(sHomeCountry) = 0) then bFlag := true;
          
          sUserData := sUserData +
                       DecorateStForCSV(sMaritalStatus) + ';' +
                       DecorateStForCSV(sHomePhone) + ';' +
                       DecorateStForCSV(sHomeFax) + ';' +
                       DecorateStForCSV(sHomeCellular) + ';' +
                       DecorateStForCSV(sHomeStreetAddress) + ';' +
                       DecorateStForCSV(sHomeCity) + ';' +
                       DecorateStForCSV(sHomeState) + ';' +
                       DecorateStForCSV(sHomeZIP) + ';' +
                       DecorateStForCSV(sHomeCountry) + ';';
        end;                    
// -------------------------------------------------------------------------------------------------
      if bFlag then sOut := sOut + sUserData + #13#10;
    end;
    
  AddLineToFile(sOut, EXPORT_FILE_NAME, 0);    
end.