Skip to main content
ExLibris
  • Subscribe by RSS
  • Ex Libris Knowledge Center

    Trying to delete patron record and receive "Unable to delete patron" error

    • Product: Voyager
    • Relevant for Installation Type: Multi-Tenant Direct, Dedicated-Direct, Local, TotalCare

     

    Question

    Unable to delete patron record.  Checked to make sure have correct permissions.

    Receive "Unable to delete patron. Patron has existing stub patrons" or "Unable to delete patron" error.

    Answer

    There are various reasons why patron records can't be deleted.  These reasons include that the patron has fines/fees, existing charges, or pending requests.  These must be cleared before the record can be deleted.  See: Overview of the Voyager patron record purge for a complete list of these reasons.

    Additional Information

    The following Prepackaged Reports Access query may help you to determine why a patron record can't be deleted.  It will prompt you for a barcode and display which reasons the patron can't be deleted apply to the patron record.

    Note that patron records can have duplicate barcodes.  For that reason, the Patron ID number from the title bar in the circulation client is included in the query results (in parentheses).

    SELECT 'Last_name:' & patron.last_name & ' (' & patron_barcode.patron_id & ')' AS reason
    FROM patron_barcode INNER JOIN patron ON patron_barcode.PATRON_ID = patron.PATRON_ID
    WHERE (((patron_barcode.[patron_barcode])=[Patron barcode:]) AND ((patron_barcode.patron_id)=[patron].[patron_id]))
    UNION ALL select distinct 'At your library, one or more items charged out.' 
    & ' (' & patron_barcode.patron_id & ')' as reason
    from patron_barcode, circ_transactions
    where patron_barcode=[Patron barcode:]
    and patron_barcode.patron_id = circ_transactions.patron_id
    UNION ALL
    select distinct 'At your library, one or more pending holds.' 
    & ' (' & patron_barcode.patron_id & ')' as reason
    from patron_barcode, hold_recall
    where patron_barcode=[Patron barcode:]
    and patron_barcode.patron_id = hold_recall.patron_id
    and request_item_count <> '-1'
    UNION ALL
    select distinct 'At your library, unpaid fines or fees.' 
    & ' (' & patron_barcode.patron_id & ')' as reason
    from patron_barcode, fine_fee
    where patron_barcode=[Patron barcode:]
    and patron_barcode.patron_id = fine_fee.patron_id and fine_fee_balance <>'0'
    UNION ALL
    select distinct 'At your library, one or more circ transaction exceptions.' 
    & ' (' & patron_barcode.patron_id & ')' as reason
    from patron_barcode, circ_trans_exception
    where patron_barcode=[Patron barcode:]
    and patron_barcode.patron_id = circ_trans_exception.patron_id
    UNION ALL
    select distinct 'At your library, one or more pending requests.' 
    & ' (' & patron_barcode.patron_id & ')' as reason
    from patron_barcode, call_slip
    where patron_barcode=[Patron barcode:]
    and patron_barcode.patron_id = call_slip.patron_id;
    UNION ALL
    select distinct 'At your library, items en route from another lib.' 
    & ' (' & patron_barcode.patron_id & ')' as reason
    from patron_barcode, ub_routing
    where patron_barcode=[Patron barcode:]
    and patron_barcode.patron_id = ub_routing.patron_id_ub
    and db_id_from <> '0'
    and db_id_to = '0'
    UNION ALL
    SELECT DISTINCT 'At your library, patron has proxies. ' 
    & '(' & patron_barcode.patron_id & ')' AS Reason
    FROM PATRON_BARCODE INNER JOIN PROXY_PATRON ON
    PATRON_BARCODE.PATRON_BARCODE_ID = PROXY_PATRON.PATRON_BARCODE_ID
    WHERE (((PATRON_BARCODE.PATRON_BARCODE)=[Patron barcode:]))
    UNION ALL
    SELECT 'At your library, patron is a proxy for ' 
    & patron_barcode.patron_barcode 
    & '. (' & patron_barcode_1.patron_id & ')' AS Reason
    FROM (PROXY_PATRON INNER JOIN PATRON_BARCODE ON
    PROXY_PATRON.PATRON_BARCODE_ID = PATRON_BARCODE.PATRON_BARCODE_ID) INNER
    JOIN PATRON_BARCODE AS PATRON_BARCODE_1 ON
    PROXY_PATRON.PATRON_BARCODE_ID_PROXY =
    PATRON_BARCODE_1.PATRON_BARCODE_ID
    WHERE (((PATRON_BARCODE_1.PATRON_BARCODE)=[Patron barcode:]))
    UNION ALL
    SELECT DISTINCT 'At another library (' 
    & mid([voyager_databases].[db_code],2,3) & '), there is a stub patron record.' 
    & ' (' & patron_barcode.patron_id & ')' AS reason
    FROM patron_barcode, ub_patron_record, voyager_databases
    WHERE (([patron_barcode].[PATRON_BARCODE]=[Patron barcode:])
    AND ([patron_barcode].[PATRON_ID]=[ub_patron_record].[patron_id])
    AND ([ub_patron_record].[db_id] = [voyager_databases].[db_id]))
    UNION ALL
    select distinct 'At another library, fines owed.' 
    & ' (' & patron_barcode.patron_id & ')' as reason
    from patron_barcode, ub_fine_fee
    where patron_barcode=[Patron barcode:]
    and patron_barcode.patron_id = ub_fine_fee.patron_id
    and fine_fee_total <> '0'
    UNION ALL
    select distinct 'At another library, requests pending.' 
    & ' (' & patron_barcode.patron_id & ')' as reason
    from patron_barcode, ub_request
    where patron_barcode=[Patron barcode:]
    and patron_barcode.patron_id = ub_request.patron_id
    UNION ALL
    select distinct 'At another library, items charged.' 
    & ' (' & patron_barcode.patron_id & ')' as reason
    from patron_barcode, ub_charge
    where patron_barcode=[Patron barcode:]
    and patron_barcode.patron_id = ub_charge.patron_id
    UNION ALL
    select distinct 'At another library, items on hold.' 
    & ' (' & patron_barcode.patron_id & ')' as reason
    from patron_barcode, ub_hold
    where patron_barcode=[Patron barcode:]
    and patron_barcode.patron_id = ub_hold.patron_id;

     

    Constructing custom SQL queries by request and troubleshooting unexpected results from customer-created SQL queries falls outside the scope of Support. The above has been posted for informational purposes.  Voyager-L and Developer Network are useful resources for finding helpful custom SQL or obtaining assistance from peers in troubleshooting custom queries.

     


    • Article last edited: 04-Dec-2020
    • Was this article helpful?