Html table을 활용해서 sqlTransaction으로 먼저 insert된 데이터의 id를 활용해서 두 번째 insert할 데이터의 params로 사용할 수 있나요?

여러 방법으로 테스트해보다가 성공하지 못해서 구현이 가능한건지 궁금해서 문의드립니다 :slight_smile:

이해를 돕기 위해 간략한 테이블 예시를 함께 첨부합니다!

테이블 구조는 아래와 같습니다.
journal : 전표 테이블
account_chart : 계정과목 테이블
journal_entry : 개별 분개 테이블. 전표 데이터의 상세 데이터입니다. (journal_id와 account_chart_id를 FK로 보유)

구현하고 싶은 기능은 아래와 같습니다.

journal 데이터는 journal_entry 데이터를 최소 2개 이상 보유해야 하기 때문에, journal과 journal_entry(2개 이상)를 동시에 생성해야 하며, 생성되는 journal_entry는 journal_id를 FK로 보유해야 합니다.
모달에서 insert하는 경우, table 형식으로 복수 데이터를 입력하는 방법을 찾지 못해, 아래와 같이 고민하고 있었습니다!

기능의 동작 순서는 아래와 같습니다.

1. journal 조회 페이지에 표시된 [등록] 버튼을 눌러 모달 열기
여기까지는 아무 문제 없습니다!

2. 모달에서 journal과 journal_entry 정보를 각각 입력
insert 기능이 포함된 경우, form이 자동 적용되어서 display: html table을 사용해봐야 하나 고민 중입니다!

3. 입력 완료 후 제출 버튼 클릭

4. sqlTransaction으로 journal을 먼저 insert

5. sqlTransaction으로 (4)에서 생성된 journal_id를 활용하여 journal_entry 생성
(4)에서 생성된 journal_id를 params로 잡을 수 있을지, 아니면 LAST_INSERT_ID() 등으로 인용할 수 있을지 궁금합니다!

안녕하세요.

requestSubmitFn 과 block id, params format: table 등을 활용한 방법 예제와 함께 안내드립니다.

추가로 궁금하신점은 문의 주시기 바랍니다.

감사합니다.

menus:
- path: pages/QNA_wz
  name: 새로운 메뉴

pages:
- path: pages/QNA_wz
  title: 제목
  subtitle: 내용

  blocks:
    # 전표 목록 조회
    - type: query
      resource: mysql.qa
      sql: >
        SELECT 
            j.id,
            j.date,
            j.status,
            j.description,
            COUNT(je.id) as entry_count,
            j.created_at
        FROM journal j
        LEFT JOIN journal_entry je ON j.id = je.journal_id
        GROUP BY j.id, j.date, j.status, j.description
        ORDER BY j.date DESC
      id: journal_list

    # Journal 생성 쿼리 (숨김)
    - type: query
      resource: mysql.qa
      sqlType: insert
      sql: >
        INSERT INTO journal 
        SET date = :date,
            status = :status,
            url = :url,
            description = :description,
            created_at = NOW()
      params:
        - key: date
        - key: status
        - key: url
        - key: description
      id: query_create_journal
      hidden: true
      reloadAfterSubmit: true
      toast: 전표 기본정보 저장됨

    # Journal Entry 생성 쿼리 (숨김)
    - type: query
      resource: mysql.qa
      sqlType: insert
      sql: >
        INSERT INTO journal_entry 
        SET journal_id = :journal_id,
            partner_id = :partner_id,
            debit_account_chart_id = :debit_account_chart_id,
            debit_amount = :debit_amount,
            credit_account_chart_id = :credit_account_chart_id,
            credit_amount = :credit_amount,
            created_at = NOW()
      params:
        - key: journal_id
        - key: partner_id
        - key: debit_account_chart_id
        - key: debit_amount
        - key: credit_account_chart_id
        - key: credit_amount
      id: query_create_journal_entry
      hidden: true
      toast: 분개 항목 추가됨

    # 전표 등록 폼
    - type: query
      resource: mysql.qa
      sqlType: insert
      sql: >
        SELECT 1
      resetAfterSubmit: true
      display: form
      formOptions:
        firstLabelWidth: 90px
        width: 1200px
      params:
        - key: date
          label: 전표 날짜
          required: true
          format: date
          title: 전표 정보
        - key: status
          label: 상태
          required: true
          datalist:
            - value: draft
              label: 임시저장
            - value: confirmed
              label: 승인완료
          selectOptions:
            enabled: true
          defaultValue: draft
        - key: url
          label: URL
          width: 400px
        - key: description
          label: 적요
          required: true
          width: 400px

        - key: entries
          title: 분개 정보
          label: 분개 내역
          format: table
          value:
            - partner_id: ''
              debit_account_chart_id: ''
              debit_amount: ''
              credit_account_chart_id: ''
              credit_amount: ''
          headers:
            partner_id:
              label: 거래처
              required: true
              datalist:
                - value: 1
                  label: ABC상사
                - value: 2
                  label: XYZ유통
                - value: 3
                  label: 대한상사
                - value: 4
                  label: 글로벌무역
              selectOptions:
                enabled: true
              thStyle:
                width: 150px
            debit_account_chart_id:
              label: 차변 계정
              datalist:
                - value: 1
                  label: 현금
                - value: 2
                  label: 보통예금
                - value: 3
                  label: 매출채권
                - value: 4
                  label: 상품
                - value: 5
                  label: 매입채무
                - value: 6
                  label: 매출
                - value: 7
                  label: 매입
                - value: 8
                  label: 급여
              selectOptions:
                enabled: true
              thStyle:
                width: 150px
            debit_amount:
              label: 차변 금액
              format: number
              thStyle:
                width: 120px
            credit_account_chart_id:
              label: 대변 계정
              datalist:
                - value: 1
                  label: 현금
                - value: 2
                  label: 보통예금
                - value: 3
                  label: 매출채권
                - value: 4
                  label: 상품
                - value: 5
                  label: 매입채무
                - value: 6
                  label: 매출
                - value: 7
                  label: 매입
                - value: 8
                  label: 급여
              selectOptions:
                enabled: true
              thStyle:
                width: 150px
            credit_amount:
              label: 대변 금액
              format: number
              thStyle:
                width: 120px

      id: form
      toast: |
        전표가 성공적으로 등록되었습니다.
      toastOptions:
        type: success
        position: top-right
        duration: 4000      
      requestSubmitFn: |
        const entries = form.params.entries.value || []

        if (entries.length === 0) {
          throw new Error('분개 내역을 입력해주세요. (최소 1개 필요)')
        }

        let totalDebit = 0
        let totalCredit = 0

        for (const entry of entries) {
          const debitAmount = parseFloat(entry.debit_amount.value) || 0
          const creditAmount = parseFloat(entry.credit_amount.value) || 0
          totalDebit += debitAmount
          totalCredit += creditAmount
        }

        if (totalDebit !== totalCredit) {
          throw new Error(`차변 합계(${totalDebit.toLocaleString()})와 대변 합계(${totalCredit.toLocaleString()})가 일치하지 않습니다.`)
        }

        // 유효성 통과 후 journal 생성
        query_create_journal.params.date.value = form.params.date.value
        query_create_journal.params.status.value = form.params.status.value
        query_create_journal.params.url.value = form.params.url.value
        query_create_journal.params.description.value = form.params.description.value

        const journalResult = await query_create_journal.trigger()
        const journal_id = journalResult.insertId || 
                          (journalResult.rows && journalResult.rows.insertId) ||
                          (journalResult.rows && journalResult.rows[0] && journalResult.rows[0].insertId)

        if (!journal_id) {
          console.error('journal_id를 찾을 수 없습니다:', journalResult)
          throw new Error('전표 생성에 실패했습니다.')
        }

        for (const entry of entries) {
          query_create_journal_entry.params.journal_id.value = journal_id
          query_create_journal_entry.params.partner_id.value = entry.partner_id.value || null
          query_create_journal_entry.params.debit_account_chart_id.value = entry.debit_account_chart_id.value || null
          query_create_journal_entry.params.debit_amount.value = parseFloat(entry.debit_amount.value) || 0
          query_create_journal_entry.params.credit_account_chart_id.value = entry.credit_account_chart_id.value || null
          query_create_journal_entry.params.credit_amount.value = parseFloat(entry.credit_amount.value) || 0

          await query_create_journal_entry.trigger()
        }
1개의 좋아요

자세히 안내해주셔서 감사합니다!
한 번에 이해가 되네요 :raising_hands:

1개의 좋아요