when subselecting: (select top 1 BookCreditAmount ),(select top 1 BookDebitAmount )
You will always get nothing. There is NO FROM clause.
So your query should look something like:
select h.InvoiceNum,h.PartNum, d.BookCreditAmount, d.BookDebitAmount
from GLJrnDtl as h
left join InvcDtl d on
h.ARInvoiceNum=d.InvoiceNum
where h.ARInvoiceNum=154788
and h.SegValue1=46804
That leaves you with the point that any line > 1 will show the amounts too.
So you need to check on Row_NUMBER() thus query might be:
select InvoiceNum, PartNum, BookCreditAmount, BookDebitAmount
FROM
(
select ROW_NUMBER() OVER (ORDER BY h.ARInvoiceNum) AS ROWNR,
h.InvoiceNum,h.PartNum, d.BookCreditAmount, d.BookDebitAmount
from GLJrnDtl as h
left join InvcDtl d on h.ARInvoiceNum=d.InvoiceNum
) as row1
WHERE rownr=1
and row1.ARInvoiceNum=154788
and row1.SegValue1=46804
UNION
select InvoiceNum, PartNum, NULL, NULL
FROM
(
select ROW_NUMBER() OVER (ORDER BY h.ARInvoiceNum) AS ROWNR,
h.InvoiceNum,h.PartNum, d.BookCreditAmount, d.BookDebitAmount
from GLJrnDtl as h
left join InvcDtl d on h.ARInvoiceNum=d.InvoiceNum
) as rowOther
where rownr > 1 and rowOther.ARInvoiceNum=154788
and rowOther.SegValue1=46804