2017-02-01 1 views
0

вот что я пытаюсь достичь, я собираюсь создать массив JSON как это:Как правильно создать вложенный json-массив при циклизации базы данных SQL в node.js?

[{ 
    "KODE_CLAIM" : "MMKLKKK01", 
    "DETAILS" : { 
     "No_SVC" : "1233456789", 
     "Date_SVC" : "01-01-2016" 
    } 
}, 
{ 
    "KODE_CLAIM" : "MMKLKKK02", 
    "DETAILS" : { 
     "No_SVC" : "1233456789", 
     "Date_SVC" : "01-01-2016" 
    } 
}] 

это вложенная JSON, я получаю данные из SQL Server. Вот что я делаю:

exports.reportClaim = function(req, resp) { 
    var kode_bass = req.params.kode_bass 
    var tgl_Awal = req.params.tgl_Awal 
    var tgl_Akhir = req.params.tgl_Akhir 
    var hddt = [] 
    var details = []; 

    console.log(kode_bass,tgl_Awal,tgl_Akhir); 

    db.executeSql("exec NG_CLAIM_REPORT_HD '" + kode_bass + "','" + tgl_Awal + "','" + tgl_Akhir + "'" , function(data, err) { 
     if (err) { 
      httpMsgs.show500(req, resp, err); 
     } else { 
      for(var i=0;i < data.length; i++){ 
       console.log(data[i].KODE_CLAIM); 
       hddt.push(data[i].KODE_CLAIM) 
       db.executeSql("exec NG_CLAIM_REPORT_DT '" + data[i].KODE_CLAIM + "'" , function(data, err) { 
        if (err) { 
         httpMsgs.show500(req, resp, err); 
        } else { 

         for(var i=0;i < data.length; i++){ 
          console.log(data.length); 
          hddt[details] = data; 
          console.log(hddt); 
         } 
        }; 
       }); 
      } 

      httpMsgs.sendJson(req, resp, hddt); 
     }; 
    }); 
}; 

я сталкиваюсь с двумя проблемами, первый я не могу передать данные в hddt [] массив, а второй я думаю, что обратный вызов причина того, JSON уже отправить на веб-страницу, но для цикл задерживается, я думаю, потому что обратный вызов правильно?

, когда я сделать вторую петлю здесь:

 db.executeSql("exec NG_CLAIM_REPORT_DT '" + data[i].KODE_CLAIM + "'" , function(data, err) { 
      if (err) { 
       httpMsgs.show500(req, resp, err); 
      } else { 
       for(var i=0;i < data.length; i++){ 
        console.log(data.length); 
        hddt[details] = data; 
       } 
      }; 
     }); 

ошибка в консоли сказал, «детали» не определен Как я могу исправить это? У меня есть другой способ выполнить SQL Server без обратного вызова? и как перенести мои данные второй хранимой процедуры в мой объект массива и вернуть его как JSON?

Ниже мой SQL данных, когда выполнить "NG_CLAIM_REPORT_HD" KODE_CLAIM 1 CLM/B094/1403/0001 2 CLM/B094/1403/0002

здесь мой SQL данных, когда выполнить "NG_CLAIM_REPORT_DT" с PARAM "CLM/B094/1403/0001"

 KODE_CLAIM    No_SVC    Date_SVC 
1. CLM/B094/1403/0001 SVC/B094/1401/0026 2014-01-20 00:00:00.000 
2. CLM/B094/1403/0001 SVC/B094/1309/0003 2013-09-18 00:00:00.000 

Когда я выполнить ИП NG_CLAIM_REPORT_DT с парам "CLM/B094/1403/0002"

 KODE_CLAIM    No_SVC     Date_SVC 
1. CLM/B094/1403/0002 SVC/B094/1312/0006 2013-12-16 00:00:00.000 
2. CLM/B094/1403/0002 SVC/B094/1312/0005 2013-12-16 00:00:00.000 

поэтому данные JSON я хочу это:

[{ 
    "KODE_CLAIM" : "CLM/B094/1403/0001", 
    "DETAILS" : [ 
     { 
     "No_SVC" : "SVC/B094/1401/0026", 
     "Tgl_SVC" : "2014-01-20 00:00:00.000" 
     }, 
     { 
     "No_SVC" : "SVC/B094/1309/0003", 
     "Tgl_SVC" : "2013-09-18 00:00:00.000" 
     } 
    ] 
}, 
{ 
    "KODE_CLAIM" : "CLM/B094/1403/0002", 
    "DETAILS" : [{ 
     "No_SVC" : "SVC/B094/1312/0006", 
     "Tgl_SVC" : "2014-01-20 00:00:00.000" 
     }, 
     { 
      "No_SVC" : "SVC/B094/1312/0005", 
      "Tgl_SVC" : "2013-09-18 00:00:00.000" 
     } 
    ] 
}] 
+0

'Я не могу вытолкнуть данные в hddt [] array' почему бы и нет? вы получаете ошибку на строке 'hddt.push (data [i] .KODE_CLAIM)? –

+0

@JaromandaX извините, я добавил больше объяснений для более подробной информации, вы можете мне помочь? –

+0

Это потому, что нигде в коде вы не указали переменную с именем 'details' –

ответ

1

вам нужно использовать объекты {} а также массивы, так как ваш выход массив объектов, в том числе массив объектов

Вы также должны иметь каким-то образом, чтобы ждать, пока все asyncrhonous просьбы завершить

Один метод обработки, который с обещаниями

exports.reportClaim = function (req, resp) { 
    var kode_bass = req.params.kode_bass; 
    var tgl_Awal = req.params.tgl_Awal; 
    var tgl_Akhir = req.params.tgl_Akhir; 

    // helper function to simply "promisify" db.executeSql 
    var executeSqlP = function executeSqlP(db, sql) { 
     return new Promise(function (resolve, reject) { 
      db.executeSql(sql, function (data, err) { 
       if (err) { 
        return reject(err); 
       } 
       resolve(data); 
      }); 
     }); 
    }; 

    executeSqlP(db, "exec NG_CLAIM_REPORT_HD '" + kode_bass + "','" + tgl_Awal + "','" + tgl_Akhir + "'") 
    .then(function (claims) { 
     return Promise.all(claims.map(function (claim) { 
      return executeSqlP(db, "exec NG_CLAIM_REPORT_DT '" + claim.KODE_CLAIM + "'") 
      .then(function (details) { 
       return { KODE_CLAIM: claim.KODE_CLAIM, DETAILS: details.map(function (detail) { 
         return {No_SVC: detail.No_SVC, Tgl_SVC: detail.Date_SVC}; 
        }) 
       }; 
      }); 
     })); 
    }) 
    .then(function (hddt) { 
     httpMsgs.sendJson(req, resp, hddt); 
    }) 
    .catch(function (err) { 
     httpMsgs.show500(req, resp, err); 
    }); 
}; 

Код для ES2016 + является прет ty tidy

exports.reportClaim = function(req, resp) { 
    var kode_bass = req.params.kode_bass; 
    var tgl_Awal = req.params.tgl_Awal; 
    var tgl_Akhir = req.params.tgl_Akhir; 
    var executeSqlP = (db, sql) => new Promise((resolve, reject) => { 
     db.executeSql(sql , function(data, err) { 
      if (err) { 
       return reject(err); 
      } 
      resolve(data); 
     }); 
    }); 


    executeSqlP(db, "exec NG_CLAIM_REPORT_HD '" + kode_bass + "','" + tgl_Awal + "','" + tgl_Akhir + "'") 
    .then(claims => 
     Promise.all(claims.map(claim => 
      executeSqlP(db, "exec NG_CLAIM_REPORT_DT '" + claim.KODE_CLAIM + "'") 
      .then(details => 
       ({KODE_CLAIM: claim.KODE_CLAIM, DETAILS: details.map(detail => 
        ({No_SVC:detail.No_SVC, Tgl_SVC:detail.Date_SVC}) 
       )}) 
      ) 
     )) 
    ) 
    .then(hddt => httpMsgs.sendJson(req, resp, hddt)) 
    .catch(err => httpMsgs.show500(req, resp, err)); 
}; 
+0

awesome, it работайте хорошо, вы спасли меня, спасибо @Jaromanda X –

+0

, но я пытаюсь понять код, как второй результат SP может слить в «KODE_CLAIM» как одно дерево JSON с первым результатом SP? –

+0

Это подробная информация. Вам нужна помощь с пониманием? –

Смежные вопросы