Jorge Olguin (super carnicerias hernandez sa de cv) asked a question.

Dataset theory 101. trying to show off the simplicity of code with ABL, but struggling myself.

I've been figthing with this code, (RTFMing, john saad's excelent handbook, copilot and claude all included) but we haven't being able to make it run.... correctly (or at least, run as I need):

  1. DEFINE TEMP-TABLE ttTicket NO-UNDO
  2. LIKE-SEQUENTIAL tap.Ticket.
  3. DEFINE TEMP-TABLE ttTicketD NO-UNDO
  4. LIKE-SEQUENTIAL tap.TicketD.
  5. DEFINE TEMP-TABLE ttTicketPago NO-UNDO
  6. LIKE-SEQUENTIAL tap.TicketPago.
  7.  
  8. DEFINE DATASET prodsTicket FOR ttTicket, ttTicketD, ttTicketPago
  9. DATA-RELATION drTicketD FOR ttTicket, ttTicketD
  10. RELATION-FIELDS (
  11. Sucursal, Sucursal,
  12. Almacen, Almacen,
  13. Serie, Serie,
  14. Ticket, Ticket)
  15. DATA-RELATION drTicketP FOR ttTicket, ttTicketPago
  16. RELATION-FIELDS (
  17. Sucursal, Sucursal,
  18. Serie, Serie,
  19. Ticket, Ticket)
  20. .
  21.  
  22.  
  23.  
  24. /*-------------------------
  25. QUERIES
  26. -------------------------*/
  27. DEFINE QUERY qTicket FOR tap.Ticket, tap.TicketD, tap.TicketPago.
  28. //DEFINE QUERY qTicketD FOR tap.TicketD.
  29. //DEFINE QUERY qTicketPago FOR tap.TicketPago.
  30.  
  31. /*-------------------------
  32. DATA SOURCES
  33. -------------------------*/
  34.  
  35. DEFINE DATA-SOURCE srcTicket
  36. FOR tap.Ticket KEYS (Sucursal, Serie, Ticket).
  37.  
  38. /*DEFINE DATA-SOURCE srcTicket */
  39. /*FOR QUERY qTicket */
  40. /*tap.Ticket KEYS (Sucursal, Serie, Ticket), */
  41. /*tap.TicketD KEYS (Sucursal, Almacen, Serie, Ticket),*/
  42. /*tap.TicketPago KEYS (Sucursal, Serie, Ticket). */
  43.  
  44. DEFINE DATA-SOURCE srcTicketD
  45. FOR tap.TicketD KEYS (Sucursal, Almacen, Serie, Ticket).
  46.  
  47. DEFINE DATA-SOURCE srcTicketPago
  48. FOR tap.TicketPago KEYS (Sucursal, Serie, Ticket).
  49.  
  50. FIND LAST Ticket NO-LOCK.
  51.  
  52. QUERY qTicket:QUERY-PREPARE(
  53. SUBSTITUTE("FOR EACH tap.Ticket NO-LOCK
  54. WHERE tap.Ticket.Ticket = &1,
  55. EACH tap.TicketD OF tap.Ticket no-lock,
  56. EACH tap.TicketPago of Ticket no-lock",
  57. Ticket.Ticket)).
  58.  
  59.  
  60. BUFFER ttTicket:ATTACH-DATA-SOURCE(DATA-SOURCE srcTicket:HANDLE).
  61. BUFFER ttTicketD:ATTACH-DATA-SOURCE(DATA-SOURCE srcTicketD:HANDLE).
  62. BUFFER ttTicketPago:ATTACH-DATA-SOURCE(DATA-SOURCE srcTicketPago:HANDLE).
  63.  
  64.  
  65. MESSAGE Ticket.Ticket
  66. VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
  67.  
  68. DATASET prodsTicket:FILL().
  69.  
  70.  
  71. FOR EACH ttTicket,
  72. EACH ttTicketD OF ttTicket:
  73. DISPLAY ttTicket.Ticket ttTicketD.Articulo.
  74. END.

This code indeed finds last ticket, and shows it's number.

The issue is that the dataset picks up ALL tickets on table....

 

If I modify data-source srcTicket as the commented-out code, I get error about TicketD is on two data-source at same time...

 

Any clue on the missusing of data-sources will be very appreciatted.

 

TIA

Jorge


  • Thomas Wurl (Taste IT Consulting)

    You may wanna try this. It's almost what Peter was talking about.

    Hope this works.

    1. DEFINE TEMP-TABLE ttTicket NO-UNDO
    2. LIKE-SEQUENTIAL tap.Ticket.
    3. DEFINE TEMP-TABLE ttTicketD NO-UNDO
    4. LIKE-SEQUENTIAL tap.TicketD.
    5. DEFINE TEMP-TABLE ttTicketPago NO-UNDO
    6. LIKE-SEQUENTIAL tap.TicketPago.
    7. DEFINE DATASET prodsTicket FOR ttTicket, ttTicketD, ttTicketPago
    8. DATA-RELATION drTicketD FOR ttTicket, ttTicketD
    9. RELATION-FIELDS (
    10. Sucursal, Sucursal,
    11. Almacen, Almacen,
    12. Serie, Serie,
    13. Ticket, Ticket)
    14. DATA-RELATION drTicketP FOR ttTicket, ttTicketPago
    15. RELATION-FIELDS (
    16. Sucursal, Sucursal,
    17. Serie, Serie,
    18. Ticket, Ticket)
    19. .
    20. /*-------------------------
    21. QUERIES
    22. -------------------------*/
    23. //DEFINE QUERY qTicket FOR tap.Ticket, tap.TicketD, tap.TicketPago.
    24. //DEFINE QUERY qTicketD FOR tap.TicketD.
    25. //DEFINE QUERY qTicketPago FOR tap.TicketPago.
    26.  
    27. // Just for Ticket
    28. DEFINE QUERY qTicket FOR tap.Ticket.
    29. /*-------------------------
    30. DATA SOURCES
    31. -------------------------*/
    32. //DEFINE DATA-SOURCE srcTicket
    33. //FOR tap.Ticket KEYS (Sucursal, Serie, Ticket).
    34.  
    35. // Data-source for the Query
    36. DEFINE DATA-SOURCE srcTicket FOR QUERY qTicket.
    37. /*DEFINE DATA-SOURCE srcTicket */
    38. /*FOR QUERY qTicket */
    39. /*tap.Ticket KEYS (Sucursal, Serie, Ticket), */
    40. /*tap.TicketD KEYS (Sucursal, Almacen, Serie, Ticket),*/
    41. /*tap.TicketPago KEYS (Sucursal, Serie, Ticket). */
    42. // Normally you don't need to use KEYS. The primary key fields are used normally.
    43. DEFINE DATA-SOURCE srcTicketD
    44. FOR tap.TicketD KEYS (Sucursal, Almacen, Serie, Ticket).
    45. DEFINE DATA-SOURCE srcTicketPago
    46. FOR tap.TicketPago KEYS (Sucursal, Serie, Ticket).
    47. FIND LAST Ticket NO-LOCK.
    48. /*QUERY qTicket:QUERY-PREPARE(
    49. SUBSTITUTE("FOR EACH tap.Ticket NO-LOCK
    50. WHERE tap.Ticket.Ticket = &1,
    51. EACH tap.TicketD OF tap.Ticket no-lock,
    52. EACH tap.TicketPago of Ticket no-lock",
    53. Ticket.Ticket)).
    54. */
    55. /* Prepare to query only for ticket. But in the filter you want */
    56. // Just a sample from LAST Ticket. Whatever data type the ticketId has
    57.  
    58. DEFINE VARIABLE iTicketId AS INTEGER NO-UNDO.
    59. iTicketID = Ticket.TicketId.
    60.  
    61. QUERY qTicket:QUERY-PREPARE(
    62. SUBSTITUTE("FOR EACH tap.Ticket WHERE tap.Ticket.Ticket = &1 NO-LOCK",iTicketId).
    63. BUFFER ttTicket:ATTACH-DATA-SOURCE(DATA-SOURCE srcTicket:HANDLE).
    64. BUFFER ttTicketD:ATTACH-DATA-SOURCE(DATA-SOURCE srcTicketD:HANDLE).
    65. BUFFER ttTicketPago:ATTACH-DATA-SOURCE(DATA-SOURCE srcTicketPago:HANDLE).
    66. /*
    67. MESSAGE Ticket.Ticket
    68. VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    69. */
    70. DATASET prodsTicket:FILL().
    71. BUFFER ttTicket:DETACH-DATA-SOURCE().
    72. BUFFER ttTicketD:DETACH-DATA-SOURCE().
    73. BUFFER ttTicketPago:DETACH-DATA-SOURCE().
    74. FOR EACH ttTicket,
    75. EACH ttTicketD OF ttTicket:
    76. DISPLAY ttTicket.Ticket ttTicketD.Articulo.
    77. END.

     

    Selected as Best
  • Peter Judge (Consultingwerk)

    You haven't associated the query with the datasource anywhere.

     

    You should define the query for ttTicket for only the tables that are needed to populate that temp-table. The queries for the child tables will done by the AVM, according to the data relation.

     

  • Thomas Wurl (Taste IT Consulting)

    You may wanna try this. It's almost what Peter was talking about.

    Hope this works.

    1. DEFINE TEMP-TABLE ttTicket NO-UNDO
    2. LIKE-SEQUENTIAL tap.Ticket.
    3. DEFINE TEMP-TABLE ttTicketD NO-UNDO
    4. LIKE-SEQUENTIAL tap.TicketD.
    5. DEFINE TEMP-TABLE ttTicketPago NO-UNDO
    6. LIKE-SEQUENTIAL tap.TicketPago.
    7. DEFINE DATASET prodsTicket FOR ttTicket, ttTicketD, ttTicketPago
    8. DATA-RELATION drTicketD FOR ttTicket, ttTicketD
    9. RELATION-FIELDS (
    10. Sucursal, Sucursal,
    11. Almacen, Almacen,
    12. Serie, Serie,
    13. Ticket, Ticket)
    14. DATA-RELATION drTicketP FOR ttTicket, ttTicketPago
    15. RELATION-FIELDS (
    16. Sucursal, Sucursal,
    17. Serie, Serie,
    18. Ticket, Ticket)
    19. .
    20. /*-------------------------
    21. QUERIES
    22. -------------------------*/
    23. //DEFINE QUERY qTicket FOR tap.Ticket, tap.TicketD, tap.TicketPago.
    24. //DEFINE QUERY qTicketD FOR tap.TicketD.
    25. //DEFINE QUERY qTicketPago FOR tap.TicketPago.
    26.  
    27. // Just for Ticket
    28. DEFINE QUERY qTicket FOR tap.Ticket.
    29. /*-------------------------
    30. DATA SOURCES
    31. -------------------------*/
    32. //DEFINE DATA-SOURCE srcTicket
    33. //FOR tap.Ticket KEYS (Sucursal, Serie, Ticket).
    34.  
    35. // Data-source for the Query
    36. DEFINE DATA-SOURCE srcTicket FOR QUERY qTicket.
    37. /*DEFINE DATA-SOURCE srcTicket */
    38. /*FOR QUERY qTicket */
    39. /*tap.Ticket KEYS (Sucursal, Serie, Ticket), */
    40. /*tap.TicketD KEYS (Sucursal, Almacen, Serie, Ticket),*/
    41. /*tap.TicketPago KEYS (Sucursal, Serie, Ticket). */
    42. // Normally you don't need to use KEYS. The primary key fields are used normally.
    43. DEFINE DATA-SOURCE srcTicketD
    44. FOR tap.TicketD KEYS (Sucursal, Almacen, Serie, Ticket).
    45. DEFINE DATA-SOURCE srcTicketPago
    46. FOR tap.TicketPago KEYS (Sucursal, Serie, Ticket).
    47. FIND LAST Ticket NO-LOCK.
    48. /*QUERY qTicket:QUERY-PREPARE(
    49. SUBSTITUTE("FOR EACH tap.Ticket NO-LOCK
    50. WHERE tap.Ticket.Ticket = &1,
    51. EACH tap.TicketD OF tap.Ticket no-lock,
    52. EACH tap.TicketPago of Ticket no-lock",
    53. Ticket.Ticket)).
    54. */
    55. /* Prepare to query only for ticket. But in the filter you want */
    56. // Just a sample from LAST Ticket. Whatever data type the ticketId has
    57.  
    58. DEFINE VARIABLE iTicketId AS INTEGER NO-UNDO.
    59. iTicketID = Ticket.TicketId.
    60.  
    61. QUERY qTicket:QUERY-PREPARE(
    62. SUBSTITUTE("FOR EACH tap.Ticket WHERE tap.Ticket.Ticket = &1 NO-LOCK",iTicketId).
    63. BUFFER ttTicket:ATTACH-DATA-SOURCE(DATA-SOURCE srcTicket:HANDLE).
    64. BUFFER ttTicketD:ATTACH-DATA-SOURCE(DATA-SOURCE srcTicketD:HANDLE).
    65. BUFFER ttTicketPago:ATTACH-DATA-SOURCE(DATA-SOURCE srcTicketPago:HANDLE).
    66. /*
    67. MESSAGE Ticket.Ticket
    68. VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
    69. */
    70. DATASET prodsTicket:FILL().
    71. BUFFER ttTicket:DETACH-DATA-SOURCE().
    72. BUFFER ttTicketD:DETACH-DATA-SOURCE().
    73. BUFFER ttTicketPago:DETACH-DATA-SOURCE().
    74. FOR EACH ttTicket,
    75. EACH ttTicketD OF ttTicket:
    76. DISPLAY ttTicket.Ticket ttTicketD.Articulo.
    77. END.

     

    Selected as Best
  • Jorge Olguin (super carnicerias hernandez sa de cv)

    Thanks a lot... I'll compare, as it works. And special thanks for your commentary, as is the help that allows complete knowledge of matter....

     

    Thanks again